简体   繁体   English

Hibernate更新实体最佳做法

[英]Hibernate update entity best practice

i am trying to update an Entity (client) by modifying one of its child Entity (agence) but the repository save method don't have the same behaviour than the create one. 我试图通过修改其子实体(代理)之一来更新实体(客户端),但是存储库保存方法的行为与创建实体的行为不同。

The agence is not loaded when I update the client by giving a new agence id. 当我通过提供新的代理商ID来更新客户端时,代理商未加载。

Does somebody explain me why and how make this possible please ? 请问有人解释我为什么以及如何使其成为可能吗?

Entity client : 实体客户:

@Entity
@Table(name = "client")
public class ClientEntity extends Serializable{

    private static final long serialVersionUID = -7451447955767820762L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(unique = true, nullable = false)
    private int reference;

    @ManyToOne
    @JoinColumn(name = "agence_id")
    private AgenceEntity agence;

    // getter/setter
}

Entity agence : 实体代理:

@Entity
@Table(name = "agence")
public class AgenceEntity extends AbstractGenericEntity {

    private static final long serialVersionUID = -3674920581185152947L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(unique = true, nullable = false)
    private int id;

    @Column(nullable = false, length = 100)
    private String name;

    // getter/setter
}

Table agence : 表的年龄:

Id     |  Name
  1    |    name1
  2    |    name2

Table client : 表客户端:

Reference    |   agence_id
  1          |     1

Creation client : OK 创建客户端: 确定

Agence agence = new Agence();
agence.setId(1); // load agence #1

Client client = new Client();
client.setAgence(agence);

client = clientRepository.save(client);
System.out.println(client.getReference); // print '2'
System.out.println(client.getAgence().getName()); // print 'name1'

Update client : NOK 更新客户端: NOK

Client client = clientRepository.findOne(1); // load client #1
Agence agence = new Agence();
agence.setId(2);
client.setAgence(agence); // update agence with agence #2
client = clientRepository.save(client);
System.out.println(client.getReference); // print '1'
System.out.println(client.getAgence().getName()); // print **NULL** !!!!

You haven't set the name on Agence in the "NOK" code snippet so it will print null. 您尚未在“ NOK”代码段中的Agence上设置名称,因此它将显示null。

Also, your primary key (id) is annotated with GeneratedValue so you should never call setId - it is generated for you and changing will lead to unpredictable results. 另外,您的主键(id)带有GeneratedValue注释,因此您永远不要调用setId-它是为您生成的,更改将导致不可预测的结果。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM