【问题标题】:Hibernate Java persist a subclass entity from persisted superclassHibernate Java 从持久化的超类中持久化一个子类实体
【发布时间】:2017-10-30 13:04:32
【问题描述】:

我有一个代理类和一个扩展代理的用户类。 我想将持久代理强制转换为用户并使用相同的 id、名称和名字来持久化用户。我不打算在 Agent 表中插入另一行。我该怎么做?

这是我的课程。

@Entity
@Table(name = "agent")
@Inheritance(strategy = InheritanceType.JOINED)
public class Agent {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    protected Integer id;

    @Column(name = "fistname", nullable = false)
    protected String fistname;

    @Column(name = "name", nullable = false)
    protected String name;
}

@Entity
@Table(name="user")
public User extends Agent{
   @Column(name = "login", nullable = false, unique = true)
   public String login;
   @Column(name = "password", nullable = false)
   public String password;

我愿意这样做

Agent agent=agentService.findOne(1);
User user = new User(agent);
user.setLogin("login");
...
user=userService.saveAndFlush(user);
ok = user.getId() == agent.getId();

总之,我想在需要时将代理授予用户。

【问题讨论】:

标签: java hibernate jpa


【解决方案1】:

您不能将代理强制转换为用户,但您可以通过在用户属性中设置代理的属性来从代理构建用户,除非您在 User 类中添加了来自 Agent ->User 的复制构造函数,在这两种情况下,都会创建一个新用户并添加一个新行。

【讨论】:

  • 我已经有一个复制构造函数,但它并没有使用同一个人,实际上它在我使用 saveAndFlush 时插入了另一个人
  • 是的,因为在这种情况下你正在创建一个新的用户对象,它总是会创建一个新的用户,我认为你应该在这种情况下使用组合而不是继承,这说明你的类代理将有一个 Agent 类型的类成员,并且不会再扩展 Agent,我清楚吗?
  • 是的,谢谢,但我已经考虑过了。我想知道 Hibernate 是否可以做我想做的事情。
  • 当然你可以使用合成,详情请查看link
  • 我不明白作曲对我有什么帮助。对不起,我没有得到你所说的我认为这只是删除用户中的扩展并在用户中添加代理列
【解决方案2】:

我很难做到这一点。它可以工作,但我忘记了用户是专门的代理这一事实。

@Entity
@Table(name = "agent")
@Inheritance(strategy = InheritanceType.JOINED)
public class Agent {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    protected Integer id;

    @Column(name = "fistname", nullable = false)
    protected String fistname;

    @Column(name = "name", nullable = false)
    protected String name;
}

@Entity
@Table(name="user")
public User {
   @Id
   @GeneratedValue(strategy = GenerationType.AUTO)
   protected Integer id;
   @OneToOne
   @JoinColumn(name = "id_agent",nullable = false)
   protected Agent agent;
   @Column(name = "login", nullable = false, unique = true)
   private String login;
   @Column(name = "password", nullable = false)
   private String password;

【讨论】:

    猜你喜欢
    • 2011-11-20
    • 1970-01-01
    • 2014-11-27
    • 1970-01-01
    • 1970-01-01
    • 2020-02-13
    • 1970-01-01
    • 2013-06-03
    • 2015-04-24
    相关资源
    最近更新 更多