package org.greenrobot.greendao.daotest;

import org.greenrobot.greendao.annotation.*;

import org.greenrobot.greendao.daotest.DaoSession;
import org.greenrobot.greendao.DaoException;

// THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. Enable "keep" sections if you want to edit.

/**
 * Entity mapped to table "RELATION_ENTITY".
 */
@Entity(active = true)
public class RelationEntity {

    @Id
    private Long id;
    private Long parentId;
    private Long testId;
    private long testIdNotNull;
    private String simpleString;

    /** Used to resolve relations */
    @Generated
    private transient DaoSession daoSession;

    /** Used for active entity operations. */
    @Generated
    private transient RelationEntityDao myDao;

    @ToOne(joinProperty = "parentId")
    private RelationEntity parent;

    @Generated
    private transient Long parent__resolvedKey;

    @ToOne(joinProperty = "testId")
    private TestEntity testEntity;

    @Generated
    private transient Long testEntity__resolvedKey;

    @ToOne(joinProperty = "testIdNotNull")
    private TestEntity testNotNull;

    @Generated
    private transient Long testNotNull__resolvedKey;

    @ToOne
    @Property(nameInDb = "WITHOUT_PROPERTY_TEST_ID")
    private TestEntity testWithoutProperty;

    @Generated
    private transient boolean testWithoutProperty__refreshed;

    @Generated
    public RelationEntity() {
    }

    public RelationEntity(Long id) {
        this.id = id;
    }

    @Generated
    public RelationEntity(Long id, Long parentId, Long testId, long testIdNotNull, String simpleString) {
        this.id = id;
        this.parentId = parentId;
        this.testId = testId;
        this.testIdNotNull = testIdNotNull;
        this.simpleString = simpleString;
    }

    /** called by internal mechanisms, do not call yourself. */
    @Generated
    public void __setDaoSession(DaoSession daoSession) {
        this.daoSession = daoSession;
        myDao = daoSession != null ? daoSession.getRelationEntityDao() : null;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Long getParentId() {
        return parentId;
    }

    public void setParentId(Long parentId) {
        this.parentId = parentId;
    }

    public Long getTestId() {
        return testId;
    }

    public void setTestId(Long testId) {
        this.testId = testId;
    }

    public long getTestIdNotNull() {
        return testIdNotNull;
    }

    public void setTestIdNotNull(long testIdNotNull) {
        this.testIdNotNull = testIdNotNull;
    }

    public String getSimpleString() {
        return simpleString;
    }

    public void setSimpleString(String simpleString) {
        this.simpleString = simpleString;
    }

    /** To-one relationship, resolved on first access. */
    @Generated
    public RelationEntity getParent() {
        Long __key = this.parentId;
        if (parent__resolvedKey == null || !parent__resolvedKey.equals(__key)) {
            __throwIfDetached();
            RelationEntityDao targetDao = daoSession.getRelationEntityDao();
            RelationEntity parentNew = targetDao.load(__key);
            synchronized (this) {
                parent = parentNew;
            	parent__resolvedKey = __key;
            }
        }
        return parent;
    }

    @Generated
    public void setParent(RelationEntity parent) {
        synchronized (this) {
            this.parent = parent;
            parentId = parent == null ? null : parent.getId();
            parent__resolvedKey = parentId;
        }
    }

    /** To-one relationship, resolved on first access. */
    @Generated
    public TestEntity getTestEntity() {
        Long __key = this.testId;
        if (testEntity__resolvedKey == null || !testEntity__resolvedKey.equals(__key)) {
            __throwIfDetached();
            TestEntityDao targetDao = daoSession.getTestEntityDao();
            TestEntity testEntityNew = targetDao.load(__key);
            synchronized (this) {
                testEntity = testEntityNew;
            	testEntity__resolvedKey = __key;
            }
        }
        return testEntity;
    }

    @Generated
    public void setTestEntity(TestEntity testEntity) {
        synchronized (this) {
            this.testEntity = testEntity;
            testId = testEntity == null ? null : testEntity.getId();
            testEntity__resolvedKey = testId;
        }
    }

    /** To-one relationship, resolved on first access. */
    @Generated
    public TestEntity getTestNotNull() {
        long __key = this.testIdNotNull;
        if (testNotNull__resolvedKey == null || !testNotNull__resolvedKey.equals(__key)) {
            __throwIfDetached();
            TestEntityDao targetDao = daoSession.getTestEntityDao();
            TestEntity testNotNullNew = targetDao.load(__key);
            synchronized (this) {
                testNotNull = testNotNullNew;
            	testNotNull__resolvedKey = __key;
            }
        }
        return testNotNull;
    }

    @Generated
    public void setTestNotNull(TestEntity testNotNull) {
        if (testNotNull == null) {
            throw new DaoException("To-one property 'testIdNotNull' has not-null constraint; cannot set to-one to null");
        }
        synchronized (this) {
            this.testNotNull = testNotNull;
            testIdNotNull = testNotNull.getId();
            testNotNull__resolvedKey = testIdNotNull;
        }
    }

    /** To-one relationship, resolved on first access. */
    @Generated
    public TestEntity getTestWithoutProperty() {
        if (testWithoutProperty != null || !testWithoutProperty__refreshed) {
            __throwIfDetached();
            TestEntityDao targetDao = daoSession.getTestEntityDao();
            targetDao.refresh(testWithoutProperty);
            testWithoutProperty__refreshed = true;
        }
        return testWithoutProperty;
    }

    /** To-one relationship, returned entity is not refreshed and may carry only the PK property. */
    @Generated
    public TestEntity peakTestWithoutProperty() {
        return testWithoutProperty;
    }

    @Generated
    public void setTestWithoutProperty(TestEntity testWithoutProperty) {
        synchronized (this) {
            this.testWithoutProperty = testWithoutProperty;
            testWithoutProperty__refreshed = true;
        }
    }

    /**
    * Convenient call for {@link org.greenrobot.greendao.AbstractDao#delete(Object)}.
    * Entity must attached to an entity context.
    */
    @Generated
    public void delete() {
        __throwIfDetached();
        myDao.delete(this);
    }

    /**
    * Convenient call for {@link org.greenrobot.greendao.AbstractDao#update(Object)}.
    * Entity must attached to an entity context.
    */
    @Generated
    public void update() {
        __throwIfDetached();
        myDao.update(this);
    }

    /**
    * Convenient call for {@link org.greenrobot.greendao.AbstractDao#refresh(Object)}.
    * Entity must attached to an entity context.
    */
    @Generated
    public void refresh() {
        __throwIfDetached();
        myDao.refresh(this);
    }

    @Generated
    private void __throwIfDetached() {
        if (myDao == null) {
            throw new DaoException("Entity is detached from DAO context");
        }
    }

}
