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
