我的项目中有注释驱动的hibernate功能.
现在我想在列上创建索引.我目前的列定义是
@NotNull
@Column(name = "hash")
private String hash;
Run Code Online (Sandbox Code Playgroud)
我在@Index这里添加注释.
@NotNull
@Column(name = "hash")
@Index(name="hashIndex")
private String hash;
Run Code Online (Sandbox Code Playgroud)
然后DROP TABLE并重启Tomcat服务器.在实例化服务器之后,会创建表,但我无法在后续查询中看到新索引.
SHOW INDEX FROM tableName
Run Code Online (Sandbox Code Playgroud)
期望用新索引构造表.我正在使用带有MySQL的InnoDB.
java annotations hibernate hibernate-annotations database-indexes
我正在处理一个小应用程序,我正在尝试使用Hibernate Annotations来映射我的实体.当我遇到这个例外时,我想测试一切是否正常:
Exception in thread "main" java.lang.ExceptionInInitializerError
at fr.cc2i.intervention.dao.main.Main$HibernateUtil.<clinit>(Main.java:48)
at fr.cc2i.intervention.dao.main.Main.test(Main.java:21)
at fr.cc2i.intervention.dao.main.Main.main(Main.java:32)
Caused by: java.lang.IncompatibleClassChangeError: Implementing class
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
at java.lang.ClassLoader.defineClass(ClassLoader.java:616)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
at fr.cc2i.intervention.dao.main.Main$HibernateUtil.<clinit>(Main.java:44)
... 2 more
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下这个例外吗?这是我第一次看到它.这是我的应用程序的主要内容:
package fr.cc2i.intervention.dao.main;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import fr.cc2i.intervention.dao.beans.Client;
import fr.cc2i.intervention.dao.beans.Contrat;
public class Main {
public static void test(){
Client c = new Client();
c.setCode("123343");
c.setAdresse("fkhdhdmh");
c.setNom("dgsfhgsdfgs"); …Run Code Online (Sandbox Code Playgroud) 我有一个实体 - User.它由描述User.class.
Hibernate为每个实体创建一个表,所以当我调用时session.save(user),我的数据总是保存到该表中.
现在我需要另一个表来表示相同User类型的数据,我需要将我的实体保存到该表中.
数据结构(类似这样):
table users_1_table{
string id;
string username;
}
table users_2_table{
string id;
string username;
}
Run Code Online (Sandbox Code Playgroud)
使用这个:
session.save(user1,"users_1_table")
session.save(user2,"users_2_table")
Run Code Online (Sandbox Code Playgroud)
和结果,我应该user1在users_1_table和user2 中users_2_table.
由于系统限制,我不能将这两个对象放在一个表中.(即使创建额外的字段也是个坏主意).
我可以在没有子类化的情况下这样做吗?使用programmaticaly hibernate配置?
我的实体中有一个布尔属性.这是我对它的注释:
@Column(name = "IS_ACTIVE", nullable = false, columnDefinition="BIT DEFAULT 1", length = 1)
public Boolean getActive() {
return isActive;
}
Run Code Online (Sandbox Code Playgroud)
但是columnDefinition="BIT DEFAULT 1"没有完美的工作.这是我得到的生成表的SQL代码:
IS_ACTIVE BIT(1) NOT NULL,
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
因此,当我尝试将此类的实例保存到数据库时,我得到异常:
`com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'IS_ACTIVE' cannot be null`
Run Code Online (Sandbox Code Playgroud)
如果我删除nullable = false属性:
@Column(name = "IS_ACTIVE", columnDefinition="BIT DEFAULT 1", length = 1)
public Boolean getActive() {
return isActive;
}
Run Code Online (Sandbox Code Playgroud)
所以我可以在这种情况下保存一个创建的对象.但它仍然没有设置默认值,我在数据库中的这个字段的值中得到NULL.
有什么想法吗?如果它很重要,我使用MySQL Server 5.1.我会非常感谢任何帮助.提前致谢!
我想使用Hibernate注释来表示使用连接的单向一对多关系.我想在连接上添加一个条件,这样只有当源表中的列("一")等于一个常量值时才会发生这种情况.例如.
SELECT *
FROM buildings b
LEFT JOIN building_floors bf on bf.building_id = b.id AND b.type = 'OFFICE'
Run Code Online (Sandbox Code Playgroud)
我想表示该b.type = 'OFFICE'查询的一部分.
我的问题与此问题非常相似,只是我在源表上有条件.JPA/Hibernate加入恒定价值
Java实体看起来像这样:
@Entity
@Table(name = "buildings")
public class Building {
@Id
@Column(name = "id")
private int id;
@Column(name = "type")
private String type;
@OneToMany(mappedBy = "buildingId",
fetch = FetchType.EAGER,
cascade = {CascadeType.ALL},
orphanRemoval = true)
@Fetch(FetchMode.JOIN)
// buildings.type = 'OFFICE' ????
private Set<BuildingFloors> buildingFloors;
// getters/setters
}
@Entity
@Table(name = "building_floors")
public class BuildingFloor …Run Code Online (Sandbox Code Playgroud) 如何将单个值从另一个表中的列映射到当前对象?
例:
class Foo {
@Id
@Column(name="FOO_ID")
private String fooId;
@Column(name="FOO_A")
private String fooA;
//Column to map to another table?
//is a one to one mapping - but don't want a separate object for this.
private String barCode;
}
Run Code Online (Sandbox Code Playgroud)
表: Fields
富: FOO_ID, FOO_A
酒吧: FOO_ID, BAR_CODE
如何在BAR_CODE不创建单独对象(或辅助表)的情况下检索字段JPA annotations?
在我的项目中,我有一个名为BaseEntity的POJO,如下所示.
class BaseEntity{
private int id;
public void setId(int id){
this.id=id;
}
public int getId(){
return id;
}
}
Run Code Online (Sandbox Code Playgroud)
还有一组其他POJO实体类,如Movie,Actor,......
class Movie extends BaseEntity{
private String name;
private int year;
private int durationMins;
//getters and setters
}
Run Code Online (Sandbox Code Playgroud)
我只使用BaseEntity将其用作某些界面中的占位符.我永远不必存储BaseEntity对象.我只需要存储从BaseEntity扩展的实体对象.我应该如何注释这些类,以便从BaseEntity扩展每个实体一个表.对于电影,它应该是(id,name,year,durationMins).
我是hibernate的新手.我想要做的是用于@CollectionId为我的Address类生成一个标识符.我已经使用了Collection接口.但是当我使用@GenericGenerator并将策略设置为hilo时,它会抛出异常.这是我的代码:
@Entity
@Table(name = "USER_DETAILS")
public class UserDetails {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int userId;
private String userName;
@ElementCollection
@JoinTable(name="USER_ADDRESS",
joinColumns=@JoinColumn(name="USER_ID")
)
@GenericGenerator(name = "hilo-gen", strategy = "hilo")
@CollectionId(columns = { @Column(name="ADDRESS_ID") }, generator = "hilo-gen", type = @Type(type="long"))
private Collection<Address> address = new ArrayList<Address>();
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) { …Run Code Online (Sandbox Code Playgroud) 我需要配置hibernate以避免创建重复的行,(尽管该行存在它会创建一个新的行,并且因为只设置了一个字段,所以将所有其余字段设置为NULL)
可以说我有一排如下
id des index age
1 MyName 2 23
Run Code Online (Sandbox Code Playgroud)
虽然我只是将MyName设置为des并且它已经存在于Name表中,但是hibernate会创建一个新行,如下所示
id des index age
1 MyName 2 23
2 MyName Null Null << new row with null values will be created
rather than updating the previous one
Run Code Online (Sandbox Code Playgroud)
当我想要sa.所以我在我的类中添加了以下注释,但是它越过了Entity和dynamicUpdate.
@org.hibernate.annotations.Entity(
dynamicUpdate = true
)
Run Code Online (Sandbox Code Playgroud)
我也使用@DynamicUpdate过,虽然hibernate接受它但我仍然遇到同样的问题.
有没有其他方法可以做到这一点?我的hibernate版本如下
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.2.1.Final</version>
<type>jar</type>
</dependency>
Run Code Online (Sandbox Code Playgroud)
*基于Ray的评论自爆,通过为子类的Id分配值,它可以正常工作,但如果我没有ID怎么样?我必须先做一个选择才能找到id吗?是否有任何方法强制hibernate基于child class rahter的值自动执行r而不是单独选择查找id?*
User.Java
....
import org.hibernate.annotations.DynamicUpdate;
@Entity
@Table(name = "user")
@DynamicUpdate
public class User implements Serializable {
private int ID;
private Name name;
private …Run Code Online (Sandbox Code Playgroud) hibernate updates hibernate-mapping java-ee hibernate-annotations
在两个表之间有多对多关系的映射表之间,我怎样才能为第二个实体加载id.
以下是解释我想在这里实现的内容的示例.以下是示例模式
create table user(
id int PrimaryKey,
name text
)
create table pages (
id int PrimaryKey,
page_name text
)
create table user_page (
id_user int,
id_page int,
PrimaryKey (id_user, id_page)
)
Run Code Online (Sandbox Code Playgroud)
注意:用户和页面表中还有其他列,为简洁起见,我未在此处包含这些列.
用户实体:
@Entity
@Table(name = "user")
public class User {
@id
@column(name="id")
private Integer id;
@column(name="name")
private String name;
...
...
}
@Entity
@Table(name = "page")
public class Page {
@id
@column(name="id")
private Integer id;
@column(name="page_name")
private String name;
...
...
}
Run Code Online (Sandbox Code Playgroud)
我想要做的是Set<Integer> pageIds在User …
hibernate ×10
java ×7
jpa ×3
annotations ×2
collections ×1
java-ee ×1
join ×1
spring ×1
sqlite ×1
updates ×1