我想要的是:
@Embedded(nullable = false)
private Direito direito;
Run Code Online (Sandbox Code Playgroud)
但是,正如您所知,@ Embeddable没有这样的属性.
有没有正确的方法来做到这一点?我不想要解决方法.
我正在寻找一个可嵌入的Java ETL,即可以从Java代码调用的Extract Transform Load引擎.
我发现很难找到合适的产品.
我主要看的是将分隔的文本文件加载到数据库表中,并在此过程中进行一些小的转换.
我想要以下功能:
CloverETL允许在XML中指定映射,但数据库连接必须是JNDI名称或指定driverClass,url,dbusername,password等的属性文件.因为我已经javax.sql.Datasource
通过我的依赖注入框架设置了,所以属性文件看起来很痛苦,不健壮的,特别是如果我想在多个环境(dev,test,prod)中工作.
KETL告诉我"我们目前正在全面检修KETL™的文档.因此,只有安装指南已经更新." 诚实,但没有帮助.
八达通现在是"http://www.together.at/prod/database/tdt",正在"正在建设中".
Pentaho 似乎使用与CloverETL相同的"指定driverClass"样式,而不是使用数据源,但Pentaho的文档用于从java代码调用它们的引擎很难找到.
基本上我真的很想能够做这个伪代码:
extractTransformLoad(
getInputFile( "input.csv" ) ,
getXMLMapping( "myMappingFile.xml") ,
new DatabaseWriter( getDatasource() );
Run Code Online (Sandbox Code Playgroud)
有什么建议?
我有类Money是@Embeddable
@Embeddable
public class Money implements Serializable, Comparable<Money> {
@Column(name = "amount", precision = 15, scale = 2)
private BigDecimal amount;
}
Run Code Online (Sandbox Code Playgroud)
当我在实体内部使用多次时,一切正常.例如
@Entity
public class SomeEntity implements Serializable {
@Embedded
@AttributeOverride(name = "amount", column = @Column(name = "entry"))
private Money entryValue;
@Embedded
@AttributeOverride(name = "amount", column = @Column(name = "leave"))
private Money leaveValue;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码完美无缺.
现在问题出现了,当我有另一个@Embeddable,我希望在其中有Money实例,并且实体多次使用@Embeddable.例:
嵌入式
@Embeddable
public class ReportCostValues implements Serializable {
@Embedded
@AttributeOverride(name = "amount", column = @Column(name = "covered_by_grant"))
private Money coveredByGrant;
@Embedded
@AttributeOverride(name = …
Run Code Online (Sandbox Code Playgroud)我们正在将旧的基于xml的配置转换为基于注释的配置
情况
有一个类被注释为@Embeddable(ParentPk.java)
,另一个类扩展了这个类 @Embeddable(ChildPk.java)
,这个ChildPk.java被用作复合主键SomeOwnerClass.java
,它与另一个类有外来关系,SomeChildTable.java
并倾向于使用父类中可用的属性col1和col2的 ChildPk.java
,但在执行查询Hibernate没有发现COL1和COL2,而如果我复制COL1和COL2在ChildPk.java
从父类中的每一件事工作正常.
下面是代码片段,SomeOwnerClass.java
它引用了col1和col2
> @OneToMany(orphanRemoval = true, fetch=FetchType.EAGER)
> @Cascade(value = {CascadeType.ALL,CascadeType.SAVE_UPDATE})
> @Fetch(FetchMode.JOIN)
> @JoinColumns({
> @JoinColumn(name="COL_1",insertable=false,updatable=false,referencedColumnName="COL_1"),
> @JoinColumn(name="COL_2",insertable=false,updatable=false,referencedColumnName="COL_2"),
> @JoinColumn(name="COL_3",insertable=false,updatable=false,referencedColumnName="COL_3"),
> }) private Set<SomeChildTable> collection = new
> HashSet<SomeChildTable>();
Run Code Online (Sandbox Code Playgroud)
针对这种情况的解决方案?
ParentPk.java
@Embeddable
public class ParentPk implements Serializable {
@Column(name="COL_1")
private String col1;
@Column(ame="COL_2")
private String col2;
}
Run Code Online (Sandbox Code Playgroud)
ChildPk.java …
我使用eclipselink
了JPA
.我有一个实体,它有一个由两个字段组成的复合键.以下是我的可嵌入主键类'字段(成员).
@Embeddable
public class LeavePK {
@ManyToOne(optional = false)
@JoinColumn(name = "staffId", nullable = false)
private Staff staff;
@Temporal(TemporalType.TIMESTAMP)
private Calendar date;
//setters and getters
}
Run Code Online (Sandbox Code Playgroud)
我的实体将保留与员工相关的休假数据,因此我尝试将员工对象和离开日期结合起来以生成组合键.除了我的逻辑,它不允许我在embeddable类中有一个外键映射.当我尝试使用JPA工具 - >从实体生成表时,它会给出如下错误,这解释了,但我没有得到它.
org.eclipse.persistence.exceptions.ValidationException
Exception Description: The mapping [staff] from the embedded ID class [class rs.stapp.entity.LeavePK] is an invalid mapping for this class. An embeddable class that is used with an embedded ID specification (attribute [leavePK] from the source [class rs.stapp.entity.Leave]) can only contain …
Run Code Online (Sandbox Code Playgroud) 我目前正在努力使用复合主键类的方案正确的映射注释.首先,我想用文字来实现:
我有2个类:group和FieldAccessRule.组可以有多个FieldAccessRules,而FieldAccessRule只有一个组分配.到目前为止,修改这个问题不是一个问题(简化):
public class Group{
...
@OneToMany(mappedBy = "group")
private Set<FieldAccessRule> fieldAccessRules;
...
}
Run Code Online (Sandbox Code Playgroud)
并为FieldAccessRule:
public class FieldAccessRule {
...
@ManyToOne
@JoinColumn(name = "group_id")
private Group group;
...
}
Run Code Online (Sandbox Code Playgroud)
现在,我决定使用复合PK作为FieldAccessRule,因为规则对于ONE Group和ONE Field应该是唯一的.它看起来像这样:
@Embeddable
public class FieldAccessRulePK implements Serializable{
private String fieldKey;
private Group group;
...
}
Run Code Online (Sandbox Code Playgroud)
和ofc.FieldAccessRule需要更改为
public class FieldAccessRule {
...
@EmbeddedId
private FieldAccessRulePK fieldAccessRulePK;
...
}
Run Code Online (Sandbox Code Playgroud)
如何为Group的FieldAccessRuleSet创建正确的映射?这样做,我得到:
在属性"fieldAccessRules"中,"映射者"值"组"无法解析为目标实体上的>属性.
什么是创建从Group到PrimaryKey的PART的映射的正确方法?
编辑:我知道发现,使用
public class Group{
...
@OneToMany(mappedBy = "fieldAccessRolePK.group")
private Set<FieldAccessRule> fieldAccessRules;
...
}
Run Code Online (Sandbox Code Playgroud)
完全按预期工作.它编译得很好,它可以很好地创建数据库,并且在加载具有预定义角色的组之后,它们可以按预期使用.
但是,Eclipse仍然说
在属性"fieldAccessRules"中,"映射的"值"fieldAccessRulePK.group"无法解析为目标实体上的属性.
我不确定,如果忽略错误并且"假设"每一件事情都很好......(我发现一个帖子,据说已经说过,Hibernate支持模式attr1.attr2的映射但不支持JPA确认. )
基本问题:为什么@Embedded对象不会被实例化?
有趣的观察是,如果那些不包含基本数据类型(int,boolean ...)或之前未被触及的话,Ebean不会实例化@Embedded对象.例:
@Entity
public class Embedder {
// getNotAutoInstantiated() will return null if this field was not touched before
@Embedded
private NotAutoInstantiated notAutoInstantiated = new NotAutoInstantiated();
// getAutoInstantiated() will always return an instance!
@Embedded
private AutoInstantiated autoInstantiated = new AutoInstantiated();
}
@Embeddable
public class AutoInstantiated {
// theKey is why this embedded object is always instantiated
private int theKey;
private String field1;
}
@Embeddable
public class NotAutoInstantiated {
private String field2;
}
Run Code Online (Sandbox Code Playgroud) TLDR; Doctrine2:我需要知道是否可以在Parent Entities(或MappedSuperclass')映射中将Embeddable中的字段设置为主键.我已经知道如何从Embeddable的映射中设置主键,但这并不理想(参见"长版本").
长版; 我正在尝试使用Doctrine2 Embeddables为我的实体创建身份值对象.
这是我的问题......
我在实体(MyEntity)中有两个不同的Embeddables(MyEntityId和OtherEntityId).
我希望MyEntityId中的一个字段成为MyEntity的主键.
由于我在同一实体中有两个标识嵌入,我想在实体映射文件中定义主键字段而不是可嵌入映射.
如果我在嵌入式中定义主键,那么当我想对OtherEntityId执行相同操作时遇到问题(因为我在其他地方使用它).
映射MyEntityId和OtherEntityId中的主键导致MyEntity具有复合键,这是我不想要的.
这是我目前的映射......
MyEntity:
embedded:
MyEntityId:
class: 'MyEntityId'
columnPrefix: false
OtherEntityId:
class: 'OtherEntityId'
columnPrefix: false
MyEntityId:
type: 'embeddable'
id:
id:
column: 'MyEntityId'
type: 'string'
OtherEntityId:
type: 'embeddable'
id:
id:
column: 'OtherEntityId'
type: 'string'
Run Code Online (Sandbox Code Playgroud)
解决方案?
创建两个单独的Embeddables来表示相同的Id值对象(不是非常干燥和太复杂)
从实体映射Embeddable的主键字段(这可能吗?我在文档中找不到它)
我有一个实体Ride,它嵌入了一个可嵌入的"实体" 路径.路线有一个列表属性城镇与多对多的关系,所以它有fetchtype LAZY(我不希望使用EAGER).所以我想定义的实体NamedEntityGraph 平顺,加载加载骑一个物体路线与instantied名单城镇.但是当我部署战争时,我得到了这个例外:
java.lang.IllegalArgumentException:Attribute [route]不是托管类型
骑
@Entity
@NamedQueries({
@NamedQuery(name = "Ride.findAll", query = "SELECT m FROM Ride m")})
@NamedEntityGraphs({
@NamedEntityGraph(
name = "rideWithInstanciatedRoute",
attributeNodes = {
@NamedAttributeNode(value = "route", subgraph = "routeWithTowns")
},
subgraphs = {
@NamedSubgraph(
name = "routeWithTowns",
attributeNodes = {
@NamedAttributeNode("towns")
}
)
}
)
})
public class Ride implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = …
Run Code Online (Sandbox Code Playgroud) 我在这里不知所措,也许这是显而易见的,因为我的Hibernate专业知识比其他领域弱.
在遗留代码中有一个Hibernate @Entity
类Foo
.其中一个属性是:
private OldBar bar = new OldBar();
Run Code Online (Sandbox Code Playgroud)
OldBar
是一个@Embeddable
使用单个列的类,foobar
:
@Embeddable
public class OldBar {
private String fooBar;
@Column(length = 10, nullable = false)
private String getFooBar() {
return fooBar;
}
@SuppressWarnings("unused")
private void setFooBar(String fooBar) {
this.fooBar = fooBar;
}
}
Run Code Online (Sandbox Code Playgroud)
最初的问题是我需要做一些事情OldBar.fooBar
,但原始设计有局限性,并将此字段设为私有,阻止我对其进行子类化,因此我必须创建一个完整的其他类NewBar
,以替换另一个类并获取访问权限私人领域.我认为既然NewBar
也Embeddable
有相同的@Column
名称,我可以在课堂上换掉这个字段Foo
:
private NewBar bar = new NewBar();
Run Code Online (Sandbox Code Playgroud)
我想这样做是因为我在foobar
列中有现有数据,我想透明地使用这些数据NewBar
而不是OldBar
.
通过我看到的跟踪日志,在调用构造函数时Foo()
创建了默认版本NewBar() …
embeddable ×10
jpa ×5
hibernate ×4
java ×4
doctrine-orm ×1
ebean ×1
etl ×1
extends ×1
inheritance ×1
jpa-2.1 ×1
migrate ×1
nullable ×1
one-to-many ×1
php ×1