我正在编写一个必须本地化所有String属性的应用程序,即它们必须为每个可用的Locale存储不同的值.一个快速的解决方案是使用Map,它可以在Hibernate中轻松映射,但对Java程序员来说不是很好:
public class Product {
private Map<Locale, String> description;
private Map<Locale, String> note;
Run Code Online (Sandbox Code Playgroud)
因此,我实现了一个LocalString对象,可以为不同的语言环境保存不同的字符串:
public class LocalString {
private Map<Locale, String> localStrings;
Run Code Online (Sandbox Code Playgroud)
域对象变为
public class Product {
private LocalString description;
private LocalString note;
Run Code Online (Sandbox Code Playgroud)
如何使用Hibernate注释最好地映射这些对象?
我认为最好的映射将使用LocalString作为组件完成:
@Embeddable
public class LocalString {
private Map<Locale, String> localStrings;
@ElementCollection
public Map<Locale, String> getLocalStrings() {
return localStrings;
}
Run Code Online (Sandbox Code Playgroud)
...
@Entity
public class Product {
private Long id;
private LocalString description;
private LocalString note;
@Embedded
public LocalString getDescription() {
return description;
}
Run Code Online (Sandbox Code Playgroud)
到目前为止一切正常:hbm2ddl ant任务创建了两个表,一个"Products"表和一个"Products_localStrings"表,其中包含键和值列.当我为第二个属性添加getter时,一切都会中断:
@Embedded
public …Run Code Online (Sandbox Code Playgroud) schema hibernate localization internationalization hibernate-mapping
我有一个带有Email集合属性的Person实体:
@ElementCollection
@CollectionTable(schema="u",name="emails",joinColumns=@JoinColumn(name="person_fk"))
@AttributeOverrides({
@AttributeOverride(name="email",column=@Column(name="email",nullable=false)),
})
public List<EmailU> getEmails() {
return emails;
}
Run Code Online (Sandbox Code Playgroud)
在我的Email类中,我尝试使用@Email注释电子邮件:
@Embeddable
public class EmailU implements Serializable {
private String email;
public EmailU(){
}
@Email
public String getEmail() {
return email;
}
}
Run Code Online (Sandbox Code Playgroud)
但它不起作用.我的方法应该是什么?
我一直在试图many to many两个类之间的关系Person和Address.我不知道,但在某个地方我并没有按照正确的方向思考.例如,对于多对多映射,我制作了两个表
CREATE TABLE person(p_id INTEGER,p_name TEXT,PRIMARY KEY(p_id));
CREATE TABLE address(a_id INTEGER,address TEXT);
Run Code Online (Sandbox Code Playgroud)
然后我在映射xml中尝试了一些东西.经过一些不成功的尝试后,我读到你需要三个表进行多对多的映射,就像我的一个问题的答案所说的那样.
请解释一下这个原因?为什么我需要第三张桌子?为什么我不能只与两个表建立关联?
如果没有时间,请看一下这个例子
我有两种类型的用户,临时用户和永久用户.
临时用户使用系统作为访客只需提供他们的名字并使用它,但系统需要跟踪它们.
永久用户是那些已注册且永久的用户.
一旦用户为自己创建永久记录,我需要将用户作为访客时被跟踪的所有信息复制到他的永久记录中.
课程如下,
@Entity
public class PermUser{
@Id
@GeneratedValue
private long id;
@OneToMany
private List Favorites favorites;
....
}
@Entity
public class Favorites {
@Id
@GeneratedValue
private long id;
@OneToMany (cascade = CascadeType.ALL)
@LazyCollection(LazyCollectionOption.FALSE)
private List <FavoriteItems> items;
...
}
@Entity
public class FavoriteItems {
@Id
@GeneratedValue
private long id;
private int quantity;
@ManyToOne
private Ball ball;
..
}
@Entity
public class TempUser extends PermUser{
private String date;
....
}
Run Code Online (Sandbox Code Playgroud)
问题是:
如果我克隆tempUser对象,我也会复制id参数,所以当保存perm用户对象时,它会显示一条消息,如"密钥条目'10'为密钥...",我无法先删除tempUser然后保存permUser就像保存permUser失败一样,我将错过数据.如果我尝试单独复制每个最喜欢的球项而没有项目ID,那么这将不是一种有效的方法.
示例(一句话中的问题:如图所示,用户可能有多个TempUser记录和一个PermUser记录,因此我需要将所有TempUser记录的信息添加到该单个PermUser记录中.)
Type of …Run Code Online (Sandbox Code Playgroud) 我的情况在这里描述:
eclipse在此持久性单元中定义的名为"ID_GENERATOR"的重复生成器
但是我的问题是不同的,所选答案并没有解决它:
" 有多个@SequenceGenerator 具有相同的名称是否有效,即使它用于此目的Hibernate:如何覆盖映射超类的属性? "
如果无效,还有替代方案吗?
非常感谢您的回答.
我需要将单个类映射到两个表(两个表都有多列主键).假设TABLE1具有id1,id2,id3,并且TABLE2具有id1,id2作为主键.现在编写映射文件时,我会执行以下操作:
<hibernate-mapping package="beans">
<class name="TABLE1Class" table="TABLE1">
<composite-id name="table1PK" class="TABLE1PKClass">
<key-many-to-one name="id1" class="ID1Class" column="id1"/>
<key-many-to-one name="id2" class="ID2Class" column="id2"/>
<key-many-to-one name="id3" class="ID3Class" column="id3"/>
</composite-id>
<property name="someProperty" type="integer" not-null="true" column="x"/>
<join table="TABLE2">
<key column="id1" />
<!-- <key column="id2"/> The join tag accepts only one key tag!!!
How do I map the second key??? -->
<property name="propertyFromTable2" type="float" not-null="true"/>
</join>
</class>
</hibernate-mapping>
Run Code Online (Sandbox Code Playgroud)
如您所见,join标记只接受一个键标记!如何映射第二个ID?
亲切的问候,
暴君
PS:圣诞快乐,快乐和富有成效的新年;)
我有内部联接的以下MySQL更新查询:
UPDATE Country AS c
INNER JOIN State s ON c.CountryID = s.CountryID
INNER JOIN City cy On s.StateID = cy.StateID
SET c.Active='Y', s.Active='Y',cy.Active='Y'
WHERE c.CountryID='12'
Run Code Online (Sandbox Code Playgroud)
这是我的国家地图类
enter code here
@Entity
@Table(name = "Country")
public class Country {
public Country() {
}
@Id
@Column(name = "CountryID")
private String countryID;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "country")
private Set<State> state = new HashSet<State>(0);
@Column(name = "CountryName")
private String countryName;
}
Run Code Online (Sandbox Code Playgroud)
国家的Mpping课程
@Entity
@Table(name = "State")
public class State {
public State() { …Run Code Online (Sandbox Code Playgroud) 我在使用自己的数据库服务器和Google Web应用程序时遇到问题.
我使用eclips(java EE IDE),安装了所有google插件init,并开发了一个示例google web应用程序,将其部署到web.Its正常工作.
现在我想在我的应用程序中使用自己的数据库.(MYSQL安装在localhost中).这里使用Hibernate连接数据库.所有必需的jar文件都放在WEB目录下的lib目录中.
当我运行我的应用程序时,它会给出一个错误...
com.google.apphosting.utils.jetty.JettyLogger warn
WARNING: Error for /Home
java.lang.ExceptionInInitializerError
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:169)
at org.hibernate.connection.DriverManagerConnectionProvider.configure(DriverManagerConnectionProvider.java:57)
at org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:124)
at org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:56)
at org.hibernate.cfg.SettingsFactory.createConnectionProvider(SettingsFactory.java:397)
at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:62)
at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2006)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1289)
at base.Trackerlogin.service(Trackerlogin.java:56)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
at com.google.appengine.api.socket.dev.DevSocketFilter.doFilter(DevSocketFilter.java:74)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.ResponseRewriterFilter.doFilter(ResponseRewriterFilter.java:123)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:34)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:63)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:125)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.DevAppServerServersFilter.doDirectRequest(DevAppServerServersFilter.java:369)
at com.google.appengine.tools.development.DevAppServerServersFilter.doDirectServerRequest(DevAppServerServersFilter.java:352)
at com.google.appengine.tools.development.DevAppServerServersFilter.doFilter(DevAppServerServersFilter.java:115)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) …Run Code Online (Sandbox Code Playgroud) 我有一个A级和B级
public class A{
int f1;
int f2;
int f2;
}
public class B extends A{
}
Run Code Online (Sandbox Code Playgroud)
我的问题是如何在映射到B的表中忽略一个字段,例如'f2'?
可以说我们有两个实体Entity Node和Entity Cluster。A Cluster有很多Node。一个Node可以属于多个Cluster。因此,Cluster其中有一个@ManyToMany注释。但是Node不知道Cluster它属于哪个(有意)。
当我删除a时,Cluster我想保留它所有的Nodes(将来我可以将它们添加Node到另一个s中Cluster)。所以我不需要 Cascade.DELETE。但是,如果删除a Node,Cluster则应更新所有它所属的对象(Node将从中删除它们)。
使用JPA处理此问题的最佳方法是什么?
hibernate ×10
java ×7
jpa ×2
orm ×2
annotations ×1
gwt ×1
inner-join ×1
java-ee ×1
join ×1
localization ×1
many-to-many ×1
schema ×1
spring-data ×1
validation ×1