Home php c# sql c c++ javascript python java go android git linux asp.net django .net node.js ios xcode cocoa iphone mysql tomcat mongodb bash objective-c scala visual-studio apache elasticsearch jar eclipse jquery ruby-on-rails ruby rubygems android-studio spring lua sqlite emacs ubuntu perl docker swift amazon-web-services svn html ajax xml java-ee maven intellij-idea rvm macos unix css ipad postgresql css3 json windows-server vue.js typescript oracle hibernate internet-explorer github tensorflow laravel symfony redis html5 google-app-engine nginx firefox sqlalchemy lucene erlang flask vim solr webview facebook zend-framework virtualenv nosql ide twitter safari flutter bundle phonegap centos Register | Login | Edit Tags | New Questions | 繁体 | 简体


10 questions online user: 21

0
votes
answers
6 views
+10

JPA映射失敗的奇怪消息

0

我有一個奇怪的問題JPA映射失敗轉換爲時間戳,但它使用的值似乎是整個行,而不僅僅是一個變量。JPA映射失敗的奇怪消息

的錯誤是:

java.sql.SQLException: Value '1988├╗ ├╗├╗├╗├╗├╗├╗0 
07 1234567 wk├╗0├╗├╗├╗├╗├╗            ' can not be represented as java.sql.Timestamp 

其中值似乎是整行,大部分壞字符是空的。調試日誌記錄目前沒有給我太多,我不確定它是否是我的映射類錯誤,整理問題或其他。

MySQL工作臺正確讀取表中的所有信息。從命令運行mysql會正確輸出所有數據。任何地方都不能顯示任何特殊字符。

我的映射類的簡化版本是:

@Entity 
@Audited 
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) 
public class PersonSundry { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    @NotNull 
    @OneToOne(fetch=FetchType.LAZY) 
    @JoinColumn(name="person_id", unique=true) 
    private Person person; 

    @ManyToOne(fetch=FetchType.EAGER) 
    private Lookup1 lookup1; 
    @ManyToOne(fetch=FetchType.EAGER) 
    private Lookup2 lookup2; 

    @Lob 
    private String backgroundInfo; 
    private LocalDate dateOfSomething1; 
    private LocalDate dateOfSomething2; 
    private LocalDate dateOfSomething3; 

    // getters and setters 
} 

有沒有人遇到過嗎?任何想法在哪裏看?

編輯:根本原因竟然是00-00-0000到時間戳的通用失敗演員,但是我打算留下問題打開,看看是否有人知道給出奇怪的錯誤消息的地方確切的一個。

+0

用戶執行一些操作,並將SQL發送到數據庫。該SQL打印在JPA提供程序日誌中。爲什麼不看它呢? – DN1

+0

您是否爲Hibernate添加了Java 8支持?由於JPA 2.1不支持開箱即用的java 8日期時間API –

+0

您能否顯示代碼如何堅持(如果堅持java)並找到失敗的行?數據庫中LocalDate的數據類型是什麼? – pirho

沙发
0
0

您使用的是MYSQL嗎? 請嘗試使用這種類型的連接字符串。

jdbc:mysql://yourserver:3306/yourdatabase?zeroDateTimeBehavior=convertToNull 

帶有全零組件的日期時間(0000-00-00 ...) - 這些值在Java中不能可靠地表示。 Connector/J 3.0.x在從ResultSet讀取時總是將它們轉換爲NULL。

當遇到這些值時,Connector/J 3.1默認會引發異常,因爲根據JDBC和SQL標準,這是最正確的行爲。可以使用zeroDateTimeBehavior配置屬性修改此行爲。允許的值爲:

異常(缺省值),它引發SQLException與S1009的SQLState。

convertToNull,它返回NULL而不是日期。

round,將日期舍入到最接近的最接近的值0001-01-01。

+0

這會導致MySQL隱式執行轉換。但我想知道的是爲什麼錯誤信息是不正確的。 –

+0

具有全零分量的日期時間(0000-00-00 ...) - 這些值在Java中不能可靠地表示。 Connector/J 3.0.x在從ResultSet讀取時總是將它們轉換爲NULL。 當遇到這些值時,Connector/J 3.1默認會引發異常,因爲根據JDBC和SQL標準,這是最正確的行爲。可以使用zeroDateTimeBehavior配置屬性修改此行爲。 – Sirsendu

0
votes
answers
6 views
+10

使用Spring MVC與CockroachDB

0

我正在嘗試開發一個Spring CockcoreDB集羣數據庫使用Hibernate和PostgreSQL驅動程序的應用程序。使用Spring MVC與CockroachDB

與數據庫的連接正常,並且所有表都已創建。

但是,當我啓動服務器我得到這個錯誤

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1628) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1081) ~[spring-context-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:856) ~[spring-context-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542) ~[spring-context-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122) ~[spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE] 
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:737) [spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE] 
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:370) [spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE] 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:314) [spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE] 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1162) [spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE] 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1151) [spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE] 
    at fr.esper.back.restfull.RestfullBackServer.main(RestfullBackServer.java:9) [classes/:na] 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_144] 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_144] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_144] 
    at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_144] 
    at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) [spring-boot-devtools-1.5.3.RELEASE.jar:1.5.3.RELEASE] 
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory 
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl.java:954) ~[hibernate-entitymanager-5.0.12.Final.jar:5.0.12.Final] 
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:882) ~[hibernate-entitymanager-5.0.12.Final.jar:5.0.12.Final] 
    at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:60) ~[spring-orm-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:353) ~[spring-orm-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:370) ~[spring-orm-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:359) ~[spring-orm-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1687) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE] 
    ... 21 common frames omitted 
Caused by: org.hibernate.exception.SQLGrammarException: Error accessing index information: testdb.car 
    at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:106) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] 
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] 
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:109) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] 
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:95) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] 
    at org.hibernate.tool.schema.extract.internal.InformationExtractorJdbcDatabaseMetaDataImpl.convertSQLException(InformationExtractorJdbcDatabaseMetaDataImpl.java:99) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] 
    at org.hibernate.tool.schema.extract.internal.InformationExtractorJdbcDatabaseMetaDataImpl.getIndexes(InformationExtractorJdbcDatabaseMetaDataImpl.java:609) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] 
    at org.hibernate.tool.schema.extract.internal.TableInformationImpl.indexes(TableInformationImpl.java:110) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] 
    at org.hibernate.tool.schema.extract.internal.TableInformationImpl.getIndex(TableInformationImpl.java:121) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] 
    at org.hibernate.tool.schema.internal.SchemaMigratorImpl.findMatchingIndex(SchemaMigratorImpl.java:292) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] 
    at org.hibernate.tool.schema.internal.SchemaMigratorImpl.applyIndexes(SchemaMigratorImpl.java:277) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] 
    at org.hibernate.tool.schema.internal.SchemaMigratorImpl.doMigrationToTargets(SchemaMigratorImpl.java:184) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] 
    at org.hibernate.tool.schema.internal.SchemaMigratorImpl.doMigration(SchemaMigratorImpl.java:60) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] 
    at org.hibernate.tool.hbm2ddl.SchemaUpdate.execute(SchemaUpdate.java:134) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] 
    at org.hibernate.tool.hbm2ddl.SchemaUpdate.execute(SchemaUpdate.java:101) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] 
    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:472) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] 
    at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:444) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] 
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:879) ~[hibernate-entitymanager-5.0.12.Final.jar:5.0.12.Final] 
    ... 27 common frames omitted 
Caused by: org.postgresql.util.PSQLException: ERROR: syntax error at or near "." 
    Détail : source SQL: 
SELECT NULL AS TABLE_CAT, n.nspname AS TABLE_SCHEM, ct.relname AS TABLE_NAME, NOT i.indisunique AS NON_UNIQUE, NULL AS INDEX_QUALIFIER, ci.relname AS INDEX_NAME, CASE i.indisclustered  WHEN true THEN 1 ELSE CASE am.amname  WHEN 'hash' THEN 2  ELSE 3 END END AS TYPE, (i.keys).n AS ORDINAL_POSITION, trim(both '"' from pg_catalog.pg_get_indexdef(ci.oid, (i.keys).n, false)) AS COLUMN_NAME, CASE am.amcanorder  WHEN true THEN CASE i.indoption[(i.keys).n - 1] & 1  WHEN 1 THEN 'D'  ELSE 'A'  END  ELSE NULL END AS ASC_OR_DESC, ci.reltuples AS CARDINALITY, ci.relpages AS PAGES, pg_catalog.pg_get_expr(i.indpred, i.indrelid) AS FILTER_CONDITION FROM pg_catalog.pg_class ct JOIN pg_catalog.pg_namespace n ON (ct.relnamespace = n.oid) JOIN (SELECT i.indexrelid, i.indrelid, i.indoption,   i.indisunique, i.indisclustered, i.indpred,   i.indexprs,   information_schema._pg_expandarray(i.indkey) AS keys   FROM pg_catalog.pg_index i) i  ON (ct.oid = i.indrelid) JOIN pg_catalog.pg_class ci ON (ci.oid = i.indexrelid) JOIN pg_catalog.pg_am am ON (ci.relam = am.oid) WHERE true AND n.nspname = 'testdb' AND ct.relname = 'car' ORDER BY NON_UNIQUE, TYPE, INDEX_NAME, ORDINAL_POSITION 
                                                                              ^
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2412) ~[postgresql-42.0.0.jar:42.0.0] 
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2125) ~[postgresql-42.0.0.jar:42.0.0] 
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:297) ~[postgresql-42.0.0.jar:42.0.0] 
    at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:428) ~[postgresql-42.0.0.jar:42.0.0] 
    at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:354) ~[postgresql-42.0.0.jar:42.0.0] 
    at org.postgresql.jdbc.PgStatement.executeWithFlags(PgStatement.java:301) ~[postgresql-42.0.0.jar:42.0.0] 
    at org.postgresql.jdbc.PgStatement.executeCachedSql(PgStatement.java:287) ~[postgresql-42.0.0.jar:42.0.0] 
    at org.postgresql.jdbc.PgStatement.executeWithFlags(PgStatement.java:264) ~[postgresql-42.0.0.jar:42.0.0] 
    at org.postgresql.jdbc.PgStatement.executeQuery(PgStatement.java:231) ~[postgresql-42.0.0.jar:42.0.0] 
    at org.postgresql.jdbc.PgDatabaseMetaData.getIndexInfo(PgDatabaseMetaData.java:2325) ~[postgresql-42.0.0.jar:42.0.0] 
    at org.hibernate.tool.schema.extract.internal.InformationExtractorJdbcDatabaseMetaDataImpl.getIndexes(InformationExtractorJdbcDatabaseMetaDataImpl.java:567) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final] 
    ... 38 common frames omitted 


Process finished with exit code 0 

的模式很簡單:用戶擁有多輛。

類用戶

Entity 
@Table(name = "ApplicationUser") 
public class User { 
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private long id; 
    @NotNull @Column(unique = true) 
    private String username; 
    @NotNull @Size(min = 5, max = 15) 
    private String password; 
    @NotNull 
    private String firstName; 
    @NotNull 
    private String lastName; 
    @NotNull @Column(unique = true) 
    private String mailAddress; 
    @NotNull @Column(unique = true) 
    private String phoneNumber; 
........... 
} 

級車

@Entity 
@Table(name = "car", 
     indexes = @Index(name = "owner_index", columnList = "owner_id")) 
public class Car { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private long id; 
    private String name; 
    @OneToOne 
    private User owner; 
...... 
} 

Application.properties

spring.datasource.url = jdbc:postgresql://~~~~~~/testdb 
spring.jpa.show-sql = true 
spring.jpa.database = postgresql 
spring.datasource.driver-class-name= org.postgresql.Driver 
spring.jpa.hibernate.ddl-auto = update 
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect 

在p因爲沒有創建外鍵索引,因此Car表中的外鍵「所有者」似乎來自索引

當我試圖表明從車指標,我得到:

~~~~~~~~~~/testdb> show indexes from car; 
+-------+---------+--------+-----+--------+-----------+---------+----------+ 
| Table | Name | Unique | Seq | Column | Direction | Storing | Implicit | 
+-------+---------+--------+-----+--------+-----------+---------+----------+ 
| car | primary | true | 1 | id  | ASC  | false | false | 
+-------+---------+--------+-----+--------+-----------+---------+----------+ 

我已經嘗試在球場上手動創建索引owner_id,但它不工作。

沙发
0
0

CockroachDB目前不支持Hibernate使用的所有SQL功能。

看看失敗的查詢,問題是訪問(i.keys).n其中密鑰來自information_schema._pg_expandarray(i.indkey)

我們正在跟蹤支持對Hibernate在CockroachDB here更具體的支持_pg_expandarray跟蹤here

0
votes
answers
6 views
+10

讀寫通用的枚舉休眠

0

我和對象,它包含一個字段讀寫通用的枚舉休眠

@Column(name = "section", nullable = false) 
@Enumerated(EnumType.STRING) 
private Enum section; 

這樣做的原因是因爲對象是在三個不同的項目所使用的每一個將要提供自己的枚舉。看起來寫對象很容易,但我看不懂,並繼續獲得

Caused by: java.lang.IllegalArgumentException: Unknown name value [BLAH] for enum class [java.lang.Enum] 

這當然是非常有意義的。那麼有沒有什麼辦法可以指定每個項目的值將指向哪個枚舉?

+0

這是否意味着你將有三個不同的項目連接到相同的數據庫? –

+0

他們不會連接到相同的數據庫。父類只有對象,子類是連接到在那裏定義的數據庫的類。 – Quillion

沙发
0
1

您應該在每個項目中分別定義每個枚舉屬性。

最好的辦法是從當前類中刪除枚舉屬性,註釋是類@Embeddable而不是@Entity,並在每個項目中,創造出將其嵌入一個實體類,也宣佈了自己的特定項目的枚舉porperty。

你也可以從當前類中刪除枚舉,使抽象類,與@MappedSuperclass取代@Entity,並有每個項目申報它的一個子類,聲明瞭一個具體項目的枚舉。但是,最好總體設計優先於繼承設計。

如果你需要多態,也就是說,你需要能夠泛指由一整塊的每個項目的實體代碼,你可以有每個項目的實體類實現一個接口:

public interface Sectionable<E extends Enum<E>> { 
    E getSection(); 
    void setSection(E value); 
} 

@Entity 
public class Project1Entity 
implements Sectionable<Section1> { 
    @Embedded 
    private ProjectData data = new ProjectData(); 

    @Column(name = "section", nullable = false) 
    @Enumerated(EnumType.STRING) 
    private Section1 section; 

    public ProjectData getData() { 
     return data; 
    } 

    public void setData(ProjectData newData) { 
     Objects.requireNonNull(newData, "Data cannot be null"); 
     this.data = newData; 
    } 

    @Override 
    public Section1 getSection() { 
     return section; 
    } 

    @Override 
    public void setSection(Section1 section) { 
     Objects.requireNonNull(section, "Section cannot be null"); 
     this.section = section; 
    } 
} 
0
votes
answers
5 views
+10

休眠5.x和春季數據2.X:如何在服務更新的保存方法

0

我從升級的Web應用程序的原始對象:休眠5.x和春季數據2.X:如何在服務更新的保存方法

春季(MVC)4.2.9.RELEASE,休眠4.3 .8.Final和1.7.1.RELEASE

春季(MVC)5.0.2.RELEASE,休眠5.2.12.Final和Spring數據2.0.2.RELEASE。

Web應用程序在Windows和MS SQL Server 2014 Enterprise上運行。

升級並沒有強迫我改變Hibernate和JPA的設置。但是,現在該程序的行爲非常不同,這在下面進行了解釋。

以下是應用程序中的一種典型服務方法,該方法保存一個新的Account對象,然後更新其值,如果它是新對象,則返回它。帳戶對象ID字段定義如下:

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private Long id; 

這是役方法:

@Override 
@Transactional 
public Account saveAccount(Account acc) { 

    //Step 1 
    //save method from Spring Data 
    accountRepository.save(acc); 

    //stringId is set manually only once and it is set only when a new accout object is created 
    if (acc.getStringId() == null) { 

     //Step 2 
     acc.setStringId("some_string_id"); 
    } 

    return acc; 
} 

這裏是在升級前的行爲:

步驟1:ACC是相同的保存後的對象。保存後,其id字段從null更新爲Long值。

第2步:新值自動序列化到數據庫。請注意,沒有明確的數據庫調用save方法。

這裏是升級後的行爲:

步驟1:使用accountRepository.save(acc)只是不更新??ACC對象。要獲得新的ID的對象,我一定要做到以下方式:

acc = accountRepository.save(acc) 

步驟2:將字符串ID不保存爲一個新的對象。

我正在尋找方法使系統在升級之前按照這種方式工作。原因是應用程序不是微不足道的,而且我在應用程序中遵循了編程模式(好或壞)。我想避免很多更改和重新測試。

這裏是相關配置

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:p="http://www.springframework.org/schema/p" 
     xmlns:tx="http://www.springframework.org/schema/tx" 
     xmlns:aop="http://www.springframework.org/schema/aop" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xmlns:jpa="http://www.springframework.org/schema/data/jpa" 
     xmlns:jdbc="http://www.springframework.org/schema/jdbc" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation=" 
      http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
      http://www.springframework.org/schema/context 
      http://www.springframework.org/schema/context/spring-context-3.2.xsd 
      http://www.springframework.org/schema/data/jpa  
      http://www.springframework.org/schema/data/jpa/spring-jpa-1.1.xsd        
      http://www.springframework.org/schema/tx 
      http://www.springframework.org/schema/tx/spring-tx-3.2.xsd 
      http://www.springframework.org/schema/jdbc 
      http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd"> 

    <bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close"> 
     <constructor-arg ref="hikariConfig" /> 
    </bean> 

    <bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig"> 
     <property name="poolName" value="derek6HikariCP" /> 
     <property name="connectionTestQuery" value="${jdbc.connectionTestQuery}" /> 
     <property name="dataSourceClassName" value="${jdbc.dataSourceClassName}" /> 
     <property name="maximumPoolSize" value="${jdbc.maximumPoolSize}" /> 
     <property name="minimumIdle" value="${jdbc.minimumIdle}" /> 
     <property name="idleTimeout" value="${jdbc.idleTimeout}" /> 
     <property name="connectionTimeout" value="${jdbc.connectionTimeout}" /> 
     <property name="dataSourceProperties"> 
      <props> 
       <prop key="url">${jdbc.url}</prop> 
       <prop key="user">${jdbc.username}</prop> 
       <prop key="password">${jdbc.password}</prop> 
      </props> 
     </property>  
    </bean> 

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> 
     <constructor-arg ref="dataSource"/> 
    </bean> 

    <bean id="entityManagerFactory" name="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="jpaVendorAdapter"> 
      <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" /> 
     </property> 
     <property name="packagesToScan" value="myproject.entity" /> 
     <property name="jpaProperties"> 
      <props> 
       <prop key="hibernate.dialect">${hibernate.dialect}</prop> 
       <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> 
       <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop> 
       <prop key="hibernate.max_fetch_depth">${hibernate.max_fetch_depth}</prop>         
       <prop key="hibernate.jdbc.fetch_size">${hibernate.jdbc.fetch_size}</prop> 
       <prop key="hibernate.jdbc.batch_size">${hibernate.jdbc.batch_size}</prop> 
      </props> 
     </property> 
    </bean>  

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
     <property name="entityManagerFactory" ref="emf" /> 
    </bean> 

    <tx:annotation-driven transaction-manager="transactionManager"/> 

    <context:annotation-config /> 

    <jpa:repositories base-package="myproject.entity" 
     entity-manager-factory-ref="emf" transaction-manager-ref="transactionManager" /> 

</beans> 

非常感謝您的幫助!

沙发
0
0

我想這是由於沖洗策略。你應該看看:https://vladmihalcea.com/how-does-the-auto-flush-work-in-jpa-and-hibernate/。更好地理解。

在這兩個版本更改之間,可能會發生這樣的情況:它們已更改其刷新策略默認值。所以首先閱讀上面的文件&配置你的代碼,只要你想。

0
votes
answers
5 views
+10

如何獲取共享和排他鎖在休眠

1

我試圖理解READ COMMITED和READ UNCOMMITED隔離級別在Hibernate中的工作方式,需要一些解釋。如何獲取共享和排他鎖在休眠

有2個線程THR1THR2兩者執行相同的事務方法(春季Transactional註釋與設置爲READ COMMITED隔離級別)。創建名稱交易爲這些線程TRA1TRA2相應地。該交易方法如下所示:

public void updateOrSavePreference(String name, String value) { 
    Preference preferenceToUpdate = findPreferenceUsingNamedQuery(name); // line 1. shared read lock acquired (uses HibernateTemplate.findByNamedQueryAndNamedParam(...)) 
    if (preferenceToUpdate != null) { // line 2. 
    preferenceToUpdate.setValue(value); // line 3. exclusive write lock acquired (actually I use the HibernateTemplate.merge(...) method 
             // instead a setter because the entity type is immutable, but it seems irrelevant for this example) 
    } else { // line 4. 
    HibernateTemplate.save(preferenceToUpdate); // line 5. exclusive write lock acquired 
    } 
} 

的優先級與Entity(optimisticLock = OptimisticLockType.NONE)註釋執行2PL模型爲這個實體(我錯了?)。我使用Oracle數據庫。

考慮以下方案:

  1. 讓我們假設線程THR1步驟1號線和查詢的對象。如果我理解正確,則此線程創建的事務TRA1將爲查詢的entiry獲取共享讀鎖。那麼,如果THR2線程步入第3行,試圖獲取該實體的獨佔寫入鎖定,則不應阻止THR2,直到TRA1釋放讀取鎖定爲止?

  2. 我們假設線程THR1進入第3行並獲得一個實體的獨佔寫入鎖定(獨佔鎖定一直持續到TRA1 transaction completes)。然後,THR2線程步入第1行並嘗試查詢此實體。不應該阻止THR2,因爲TRA2事務嘗試獲取讀鎖而其他事務TRA1爲此實體保存獨佔寫鎖定?

  3. 如果我從第2點複製READ UNCOMMITED隔離級別的場景,則執行TRA2事務的THR2不會看到TRA1事務中由THR1所做的更改,即使在refreshing或再次查詢實體後(「評估表達式」在調試下)。爲什麼?

沙发
0
1

通過設置讀鎖,可以實現技術上的讀提交。但不一定。如果你的DBMS支持MVCC,你總是讀取提交的數據(除了你自己的事務中更改的內容)而不設置鎖定。

所以我懷疑你使用oracle,mysql(INNODB)或postgres做你的測試?所有這些DBMS都默認支持MVCC,所以它們從不設置共享讀鎖。

由於您正在使用Oracle「MVCC」數據庫,因此即使您在您的實體上配置了2PL協議,也不會實現2PL協議。如果你想找出真正的在本地陳述你的DBMS做到了激活本地語句的輸出,你可以在persistence.xml中做到:

<property name="hibernate.show_sql" value="true" /> 

也許你也應該看看transaction-isolation-levels-relation-with-locks-on-table 或第一個在:locks and oracle

+0

我忘了提到Preference類用實體(optimisticLock = OptimisticLockType.NONE)進行了註釋,我懷疑它會爲給定的實體強制執行2PL模型。我錯了嗎? – pbartosz

+0

是的,我使用Oracle數據庫。 – pbartosz

0
votes
answers
5 views
+10

在Eclipse中我們如何才能連接H2數據庫使用Hibernate for Maven項目

-1

如何使用Hibernate連接H2數據庫用於Maven項目?在Eclipse中我們如何才能連接H2數據庫使用Hibernate for Maven項目

沙发
0
0

您可以使用Spring-boot初始化程序。只需訪問此頁面 - https://start.spring.io/

對於簡單的Spring WebMVC選擇下一個工具:Web,H2,JPA,我會推薦DevTools。

在實際應用中,你需要創建一個這樣JPA庫接口:

包ru.arvsoft.server.core.repository;

import org.springframework.data.jpa.repository.JpaRepository; 
import ru.arvsoft.server.core.domain.Author; 


public interface AuthorRepository extends JpaRepository<Author, Long> { 
} 

而且在某些類使用它:

@Service 
public class AuthorService { 

    private final AuthorRepository repository; 
    private final AuthorMapper mapper; 

    @Autowired 
    public AuthorService(AuthorRepository repository, AuthorMapper mapper) { 
     this.repository = repository; 
     this.mapper = mapper; 
    } 

    public Author getById(Long id) { 
     return repository.findOne(id); 
    } 

    public List<AuthorShortDTO> getAuthors() { 
     return repository.findAll().stream().map(mapper::mapToShortDTO).collect(Collectors.toList()); 
    } 

... 
0
votes
answers
4 views
+10

春數據JPA規範:如何通過它的孩子來過濾父對象對象屬性

0

我的實體類以下春數據JPA規範:如何通過它的孩子來過濾父對象對象屬性

@Entity 
@table 
public class User { 

    @OneToOne 
    private UserProfile userProfile; 

    // others 
} 


@Entity 
@Table 
public class UserProfile { 

    @OneToOne 
    private Country country; 
} 

@Entity 
@Table 
public class Country { 
    @OneToMany 
    private List<Region> regions; 
} 

現在,我想在一個特定區域內的所有用戶。我知道sql,但我想通過spring data jpa Specification來完成。下面的代碼不應該工作,因爲地區是一個列表,我試圖匹配一個單一的值。如何獲取區域列表並與單個對象進行比較?

public static Specification<User> userFilterByRegion(String region){ 


     return new Specification<User>() { 
      @Override 
      public Predicate toPredicate(Root<User> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) { 

       return criteriaBuilder.equal(root.get("userProfile").get("country").get("regions").get("name"), regionalEntity); 
      } 
     }; 
    } 

編輯:感謝您的幫助。其實我正在尋找下面的JPQL

SELECT u FROM User u JOIN FETCH u.userProfile.country.regions ur WHERE ur.name=:<region_name> 
沙发
0
1

等效標準查詢試試這個。這應該工作

criteriaBuilder.isMember(regionalEntity, root.get("userProfile").get("country").get("regions")) 

你可以從我的代碼

// string constants make maintenance easier if they are mentioned in several lines 
private static final String CONST_CLIENT = "client"; 
private static final String CONST_CLIENT_TYPE = "clientType"; 
private static final String CONST_ID = "id"; 
private static final String CONST_POST_OFFICE = "postOffice"; 
private static final String CONST_INDEX = "index"; 
... 

@Override 
public Predicate toPredicate(Root<Claim> root, CriteriaQuery<?> query, CriteriaBuilder cb) { 
    List<Predicate> predicates = new ArrayList<Predicate>(); 
    // we get list of clients and compare client's type 
    predicates.add(cb.equal(root 
       .<Client>get(CONST_CLIENT) 
       .<ClientType>get(CONST_CLIENT_TYPE) 
       .<Long>get(CONST_ID), clientTypeId)); 
    // Set<String> indexes = new HashSet<>(); 
    predicates.add(root 
       .<PostOffice>get(CONST_POST_OFFICE) 
       .<String>get(CONST_INDEX).in(indexes)); 
    // more predicates added 
    return return andTogether(predicates, cb); 
} 

private Predicate andTogether(List<Predicate> predicates, CriteriaBuilder cb) { 
    return cb.and(predicates.toArray(new Predicate[0])); 
} 

在區域類中重寫Equals方法(也湊碼)

+0

感謝您的幫助,但它不適用於我的情況。我需要翻譯下面的jpa條件查詢。 FROM User你好JOIN FETCH u.userProfile.country.regions你在哪裏你的名字 –

板凳
0
0

片段定義爲平等的條件,如果你是肯定的,那你只需要一個謂詞,List的使用可能是一個矯枉過正的問題。

0
votes
answers
4 views
+10

在postgresql中包含/ in文本數組的Hibernate條件

0

我有一個名爲box的實體。每個包含一些參數的參數對於許多唯一的ID都是相同的。唯一ID只是數字,並沒有任何其他角色。 所以我創建它們作爲postgresql和Java中的文本數組,我將它們作爲ArrayList並使用自定義用戶類型進行映射。 package com.geniedoc.utils;在postgresql中包含/ in文本數組的Hibernate條件

import java.io.Serializable; 
import java.sql.Array; 
import java.sql.Connection; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Types; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.Iterator; 
import java.util.List; 
import java.util.StringTokenizer; 
import org.hibernate.HibernateException; 
import org.hibernate.engine.spi.SessionImplementor; 
import org.hibernate.usertype.UserType; 

public class PostgresTextArrayType implements UserType { 

    protected static final int[] SQL_TYPES = {Types.ARRAY}; 
    public Class<String> returnedClass() { 
      return String.class; 
     } 

    public final int[] sqlTypes() { 
      return SQL_TYPES; 
     } 


     @Override 
     public Object nullSafeGet(ResultSet resultSet, String[] names, 
       SessionImplementor arg2, Object arg3) 
       throws HibernateException, SQLException { 
      List<String> list = null; 
      String nameVal = resultSet.getString(names[0]); 
      if (nameVal != null) { 
       nameVal = nameVal.substring(1,nameVal.length()-1); 
       list = new ArrayList<>(); 
       StringTokenizer tokenizer = new StringTokenizer(nameVal, ","); 
       while (tokenizer.hasMoreElements()) { 
        String val = (String) tokenizer.nextElement(); 
        list.add(val); 
       } 
      } 

      return list; 

     } 

     @Override 
     public void nullSafeSet(PreparedStatement statement, Object value, int index, 
       SessionImplementor arg3) throws HibernateException, 
       SQLException { 
      Connection connection = statement.getConnection(); 
       if (value == null) { 
        statement.setNull(index, SQL_TYPES[0]); 
       } else { 
        System.out.println("statement>>>>"+statement); 
        System.out.println("value>>>>"+ value); 
        System.out.println("index>>>>"+index); 
        @SuppressWarnings("unchecked") 
        ArrayList<String> parameter=new ArrayList<>(); 
        if(value instanceof Array) 
        { parameter=(ArrayList<String>) value; 
        }else 
        { 
         parameter.add((String) value); 
        } 
        ArrayList<String> list=parameter; 
        String[] castObject = Arrays.copyOf(list.toArray(), list.toArray().length, String[].class); 
        Array array = connection.createArrayOf("text", castObject); 
        statement.setArray(index, array); 
        System.out.println("statement>>>>"+statement); 
       } 
     } 
     @Override 
     public final Object deepCopy(final Object value) throws HibernateException { 
      return value; 
     } 

     @Override 
     public final boolean isMutable() { 
      return false; 
     } 

     @Override 
     public final Object assemble(final Serializable serializable, final Object arg1) 
       throws HibernateException { 
      return serializable; 
     } 

     @Override 
     public final Serializable disassemble(final Object o) throws HibernateException { 
      return (Serializable) o; 
     } 

     @Override 
     public final boolean equals(final Object x, final Object y) throws HibernateException { 
      if (x == y) { 
       return true; 
      } else if (x == null || y == null) { 
       return false; 
      } else { 
       return x.equals(y); 
      } 
     } 

     @Override 
     public final int hashCode(final Object x) throws HibernateException { 
      return x.hashCode(); 
     } 

     @Override 
     public final Object replace(
      final Object original, 
      final Object target, 
      final Object owner) throws HibernateException { 
      return original; 
     } 
      private String serialize(List<String> list) { 
       StringBuilder strbul = new StringBuilder(); 
       Iterator<String> iter = list.iterator(); 
       strbul.append("{"); 
       while (iter.hasNext()) { 
        strbul.append(iter.next()); 
        if (iter.hasNext()) { 
         strbul.append(","); 
        } 
       } 
       strbul.append("}"); 
       return strbul.toString(); 
      } 


} 

這是我的休眠條件: -

Session session=getSession(); 
    Criteria criteria=session.createCriteria(Box.class); 
    criteria.add(Restrictions.in("unique_id", unique_id)); 
    return (Unit)criteria.uniqueResult(); 

我需要包含一個特定的獨特id.But它不工作的框。 僅當我在數據庫中的文本數組中有一個值時才返回結果。 但是,如果我有在數據庫中的多個值,它不顯示任何結果。

任何幫助表示讚賞。

沙发
0
0

實施UserType通常是不值得的。由於Postgres接受數組的字符串格式,因此將類型@PrePersist,??和@PostLoad函數添加到您的類中會更好。由於它只是數字,所以轉換非常簡單。

@Transient 
private long[] theids; 

@Column(name = "the_ids") 
private String therealids; 

@PrePersist 
@PreUpdate 
private void encode() { 
    therealids = "{" + java.util.Arrays.toString(theids) + "}"; 
} 

@PostLoad 
private void decode() { 
    String[] ids = therealids.split(","); 
    theids = new long[ids.length]; 
    if (ids.length == 0) { 
     return; 
    } 
    int last = ids.length - 1; 
    // remove the "{" 
    ids[0] = ids[0].substr(1); 
    // remove the "}" 
    ids[last] = ids[last].substr(0, ids[last].length() - 1); 
    for (int i = 0; i < ids.length; i++) theids[i] = Long.parseLong(ids[i]); 
} 

至少有4個優化你可以做這個代碼,使其速度更快,更少的內存大戶,但這是短版。

如果您想要做同樣的事情,但是對於字符串數組,您必須非常瞭解該場景中陣列的正確轉義語法,更糟糕的是,可選的雙引號。

0
votes
answers
4 views
+10

映射NCLOB在Hibernate中

0

我在Oracle表已經兩個列:映射NCLOB在Hibernate中

  • firstColumn NVARCHAR2
  • secondColumn NCLOB

映射在類:

@Column(length = 1000, columnDefinition = "nvarchar2 (1000)") 
@Nationalized 
private String firstColumn; 

@Lob 
@Nationalized 
private String secondColumn; 

Additionaly財產休眠.use_nationalized_character_data設置爲true。

更新firstColumn對於中文字符正常工作,但數據庫中的secondColumn包含類似於倒置問號的內容。

我嘗試了許多組合設置註釋:

@Lob 
@Nationalized 
@Type(type="org.hibernate.type.NClobType") 
@Type(type="org.hibernate.type.MaterializedNClobType") 

但沒有成功。

  • 數據庫:Oracle數據庫10g企業版
  • 司機:ojdbc7
  • 休眠:5.2.1
沙发
0
0

我已經解決了我的映射問題。解決方案(解決方法?)是:

@Column(columnDefinition = "nclob", length=100000) 
@Nationalized 
private String secondColumn; 
0
votes
answers
4 views
+10

在PostgreSQL的where子句中使用XML列

1

我想支持某些DB的hibernate中包含XML內容的列的where子句。我通過擴展org.hibernate.dialect.OraclexDialect類並通過registerFunction方法註冊xml函數來實現Oracle。生成的查詢的示例:在PostgreSQL的where子句中使用XML列

SELECT * 
FROM OM_PERSON this_ 
WHERE xmltype.createxml(this_.config_xml).existsNode('/*[condition/text()="19943"]')=1; 

其在hibernate註冊(對於Oracle)函數:

xmltype.createxml(?1).existsNode(?2) 

現在我想支持PostgreSQL(優選版本:9.6)過了,我找不到任何等效的功能。所以我的問題是在PostgreSQL上面的查詢Oracle有沒有等價的函數/語句?

沙发
0
1

PostgreSQL有一個功能XMLEXISTS,所以你的查詢可以是這樣的:

SELECT * 
    FROM OM_PERSON x 
    WHERE XMLEXISTS('/*[condition/text()="19943"]' PASSING x.config_xml) 

我沒有想法,如何能在Hibernate中使用。