JPA是可嵌入的值对象吗?为什么可以';它不代表一张桌子吗

JPA是可嵌入的值对象吗?为什么可以';它不代表一张桌子吗,jpa,entity,domain-driven-design,value-objects,embeddable,Jpa,Entity,Domain Driven Design,Value Objects,Embeddable,问题:表中有只读数据。它的行没有id-只有复合键定义它的标识。我希望它在我的应用程序中作为一个值对象(DDD术语) 研究:但是如果我用@Id字段放置@embeddeble注释而不是@Entity,那么javax.persistence.metamodel没有看到它,并且在metamodel metamodel.embeddeble(MyClass.class)上说不是一个可嵌入的。我可以用@Entity类和自动生成id来包装它,但这不是我在体系结构上想要实现的 问题:JPA是可嵌入的值对象吗?E

问题:表中有只读数据。它的行没有id-只有复合键定义它的标识。我希望它在我的应用程序中作为一个值对象(DDD术语)

研究:但是如果我用
@Id
字段放置
@embeddeble
注释而不是
@Entity
,那么
javax.persistence.metamodel
没有看到它,并且在
metamodel metamodel.embeddeble(MyClass.class)上说
不是一个可嵌入的
。我可以用@Entity类和自动生成id来包装它,但这不是我在体系结构上想要实现的


问题:JPA是可嵌入的值对象吗?Embeddeble可以在没有父实体的情况下存在并表示一个表吗?

关于这个主题的许多文章都表明这是一个真正的JPA不便之处:

大多数建议基于规范化关系数据库的解决方案,其中头实体作为一个表,其值对象作为其他单独的表

我的挫败感因为需要与非规范化只读表集成而加剧。表没有id字段,用于存储对象值。没有与标头实体表的绑定。将其映射到JPA是一个问题,因为只映射id为的实体

解决方案是用MyEntity类包装MyValueObject类,使MyValueObject成为其复合键:

@Data
@Entity
@Table(schema = "my_schema", name = "my_table")
public class MyEntity {

  @EmbeddedId MyValueObject valueObject;
}
作为一个小技巧,为了绕过JPA对默认空构造函数的要求,并且不破坏Value对象的不变性,我们将其添加为private,并牺牲字段的最终修饰符。隐私和设置者的缺席符合价值对象的最初DDD理念:

// @Value // Can't use, unfortunately.
@Embeddable
@Immutable
@AllArgsConstructor
@Getter
@NoArgsConstructor(staticName = "private") // Makes MyValueObject() private.
public class MyValueObject implements Serializable {

  @Column(name = "field_one")
  private String myString;

  @Column(name = "field_two")
  private Double myDouble;

  @Transient private Double notNeeded;
}
还有一些Lombok的
@Value
注释用于配置值对象