package org.greenrobot.greendao.daotest2.specialentity;

import org.greenrobot.greendao.annotation.*;

import java.util.List;
import org.greenrobot.greendao.daotest2.dao.DaoSession;
import org.greenrobot.greendao.DaoException;

import org.greenrobot.greendao.daotest2.ToManyTarget2;
import org.greenrobot.greendao.daotest2.dao.ToManyTarget2Dao;
import org.greenrobot.greendao.daotest2.specialdao.RelationSource2Dao;
import org.greenrobot.greendao.daotest2.to1_specialdao.ToOneTarget2Dao;
import org.greenrobot.greendao.daotest2.to1_specialentity.ToOneTarget2;

// THIS CODE IS GENERATED BY greenDAO, EDIT ONLY INSIDE THE "KEEP"-SECTIONS

// KEEP INCLUDES - put your custom includes here
// KEEP INCLUDES END

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

    @Id
    private Long id;
    private Long toOneId;

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

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

    @ToOne(joinProperty = "toOneId")
    private ToOneTarget2 toOneTarget2;

    @Generated
    private transient Long toOneTarget2__resolvedKey;

    @ToMany(joinProperties = {
        @JoinProperty(name = "id", referencedName = "fkId")
    })
    private List<ToManyTarget2> toManyTarget2List;

    // KEEP FIELDS - put your custom fields here
    // KEEP FIELDS END

    @Generated
    public RelationSource2() {
    }

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

    @Generated
    public RelationSource2(Long id, Long toOneId) {
        this.id = id;
        this.toOneId = toOneId;
    }

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

    public Long getId() {
        return id;
    }

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

    public Long getToOneId() {
        return toOneId;
    }

    public void setToOneId(Long toOneId) {
        this.toOneId = toOneId;
    }

    /** To-one relationship, resolved on first access. */
    @Generated
    public ToOneTarget2 getToOneTarget2() {
        Long __key = this.toOneId;
        if (toOneTarget2__resolvedKey == null || !toOneTarget2__resolvedKey.equals(__key)) {
            __throwIfDetached();
            ToOneTarget2Dao targetDao = daoSession.getToOneTarget2Dao();
            ToOneTarget2 toOneTarget2New = targetDao.load(__key);
            synchronized (this) {
                toOneTarget2 = toOneTarget2New;
            	toOneTarget2__resolvedKey = __key;
            }
        }
        return toOneTarget2;
    }

    @Generated
    public void setToOneTarget2(ToOneTarget2 toOneTarget2) {
        synchronized (this) {
            this.toOneTarget2 = toOneTarget2;
            toOneId = toOneTarget2 == null ? null : toOneTarget2.getId();
            toOneTarget2__resolvedKey = toOneId;
        }
    }

    /** To-many relationship, resolved on first access (and after reset). Changes to to-many relations are not persisted, make changes to the target entity. */
    @Generated
    public List<ToManyTarget2> getToManyTarget2List() {
        if (toManyTarget2List == null) {
            __throwIfDetached();
            ToManyTarget2Dao targetDao = daoSession.getToManyTarget2Dao();
            List<ToManyTarget2> toManyTarget2ListNew = targetDao._queryRelationSource2_ToManyTarget2List(id);
            synchronized (this) {
                if(toManyTarget2List == null) {
                    toManyTarget2List = toManyTarget2ListNew;
                }
            }
        }
        return toManyTarget2List;
    }

    /** Resets a to-many relationship, making the next get call to query for a fresh result. */
    @Generated
    public synchronized void resetToManyTarget2List() {
        toManyTarget2List = null;
    }

    /**
    * 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");
        }
    }

    // KEEP METHODS - put your custom methods here
    // KEEP METHODS END

}
