繁体   English   中英

Hibernate更新实体最佳做法

[英]Hibernate update entity best practice

我试图通过修改其子实体(代理)之一来更新实体(客户端),但是存储库保存方法的行为与创建实体的行为不同。

当我通过提供新的代理商ID来更新客户端时,代理商未加载。

请问有人解释我为什么以及如何使其成为可能吗?

实体客户:

@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
@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
}

表的年龄:

Id     |  Name
  1    |    name1
  2    |    name2

表客户端:

Reference    |   agence_id
  1          |     1

创建客户端: 确定

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'

更新客户端: 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** !!!!

您尚未在“ NOK”代码段中的Agence上设置名称,因此它将显示null。

另外,您的主键(id)带有GeneratedValue注释,因此您永远不要调用setId-它是为您生成的,更改将导致不可预测的结果。

暂无
暂无

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

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