H2-1. Sample Domain Model

Slave Entity

id slaveName age

Master Entity

id name
classDiagram
    class Slave {
        Long id
        String slaveName
        int age
        Master team
    }

    class Master {
        Long id
        String name
        List~Slave~ members
    }

    Slave --> Master : "0..N to 0..1"
erDiagram
    SLAVE }o--|| MASTER : "0..N : 0..1"

    SLAVE {
        LONG id
        STRING slaveName
        INT age
    }

    MASTER {
        LONG id
        STRING name
    }

Slave Entity


@Entity
@Getter @Setter // fucking setter
@AllArgsConstructor
@NoArgsConstructor
@ToString(of = {"id", "slaveName", "age"}) // allow only pure fields
public class Slave {
    @Id
    @GeneratedValue
    @Column(name = "slave_id")
    private Long id;
    private String slaveName;
    private int age;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "master_id")
    private Master master;

    public Slave(String slaveName) {
        this(slaveName, 0);
    }

    // Test Case 작성할 때는 간단하게 Constructor로 가는게 편함 (못믿겠음 해보던가)
    public Slave(String slaveName, int age) {
        this(slaveName, age, null);
    }

    public Slave(String slaveName, int age, Master master) {
        this.slaveName = slaveName;
        this.age = age;
        if (master != null) {
            changeMaster(master);
        }
    }

    public void changeMaster(Master master) {
        this.master = master;
        master.getSlaves().add(this);
    }
}

Master Entity


@Entity
@Getter @Setter // fucking setter
@NoArgsConstructor
@ToString(of = {"id", "name"})
public class Master {
	@Id @GeneratedValue
	@Column(name = "master_id")
	private Long id; 
	private String name;
	
	@OneToMany(mappedBy = "master")
	private List<Slave> slaves = new ArrayList<>();
	
	public Master(String name) {
		this.name = name;
	}
}

JUnit Test


@SpringBootTest
@Transactional
@Commit
public class SlaveTest {
    @PersistenceContext
    EntityManager em;

    @Test
    public void testEntity() {

        // Define Master Entities
        Master masterA = new Master("masterA");
        Master masterB = new Master("masterB");

        // Put Entities into Persistence Context
        em.persist(masterA);
        em.persist(masterB);

        // Define Slave Entities
        Slave slave1 = new Slave("slave1", 10, masterA);
        Slave slave2 = new Slave("slave2", 20, masterB);
        Slave slave3 = new Slave("slave3", 30, masterA);
        Slave slave4 = new Slave("slave4", 40, masterB);

        // Put Entities into Persistence Context
        em.persist(slave1);
        em.persist(slave2);
        em.persist(slave3);
        em.persist(slave4);

        // Init
        em.flush(); // Send Queries
        em.clear(); // Init Persistence Context

        // Check
        List<Slave> slaves = em.createQuery("select s from Slave s", Slave.class)
                .getResultList();

        // Iterate
        for(Slave s : slaves){
            System.out.println("slave=" + s);
            System.out.println("-> slave.team=" + s.getMaster()); // get proxy but not call handler
        }
    }
}

Result


image.png