小编Jar*_*rdo的帖子

使用Hibernate中的注释定义默认列值

我知道这里有很多关于SO和网络的问题,但是所有答案都建议使用columnDefinition哪个是特定于数据库的,因此不适合我,因为我正在研究的系统需要在不同的数据库上运行.

我发现了这个hibernate问题,有人请求注释这个功能.问题已经结束,说另一个问题将涵盖该功能.第二个问题显然添加了注释@Generated以及其他一些注释,但我找不到任何关于如何使用这些新注释定义默认列值的文档.

所以我的问题是:有谁知道如何用注释定义默认列值(而不是使用columnDefinition)?

编辑:进一步澄清我的问题:当我添加一个新的非空列时,我需要Hibernate来更新现有的模式(将新列添加到相应的表).但由于该列为非null,因此数据库无法在未指定默认值的情况下创建列(如果表中已存在某些行).所以我需要指示Hibernate发出以下DDL语句:ALTER TABLE my_table ADD COLUMN new_column VARCHAR(3) DEFAULT 'def'但它必须独立于使用的数据库.

java ddl hibernate

10
推荐指数
2
解决办法
2万
查看次数

Hibernate:没有实体类的外键,只能通过id

我有一个分层实体,它将自己引用为父母.我只需要通过id进行映射,而不是通过实体实例进行映射(原因太复杂,无法解释).所以我这样定义了实体:

class Item {

    @Id
    private String id;

    @ManyToOne(targetEntity = Item.class)
    @JoinColumn(name = "PARENT_ID", nullable = true)
    private String parentId;

}
Run Code Online (Sandbox Code Playgroud)

这似乎工作正常.在数据库中正确创建外键约束.但是当我执行以下查询时:

SELECT i FROM Item i WHERE i.parentId = :parentId
Run Code Online (Sandbox Code Playgroud)

我得到了这个例外(有趣的部分是粗体):

org.hibernate.PropertyAccessException:调用com.example.dom.Item.id的getter时发生IllegalArgumentException 在org.hibernate.property.BasicPropertyAccessor $ BasicGetter.get(BasicPropertyAccessor.java:192)在org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:346)在org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier (AbstractEntityPersister.java:4746)在org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:4465)在org.hibernate.engine.internal.ForeignKeys.isTransient(ForeignKeys.java:243)在org.hibernate作为. org.hibernate.type.EntityType.getIdentifier(EntityType.java:537)上的org.hibernate.type.ManyToOneType.nullSafeSet(ManyToOneType.java:174)中的engine.internal.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:293) .hibernate.param.NamedParameterSpecification.bind(NamedParameterSpecification.java:67)位于org.hibernate.loader.Loader.cutePart中的Org.hibernate.loader.hql.QueryLoader.bindParameterValues(QueryLoader.java:616)或者org.hibernate.loader.Loader.executeQueryStatement上的org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1901) .java:1862)org.hibernate.loader.Loader.Ladader.doQuery.doQuery.doQueryAndInitializeNonLazyCollections上的org.hibernate.loader.Loader.doQuery(Loader.java:910)中的org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1839) Loader.java:355)org.hibernate.loader.Loader.doList(Loader.java:2554)位于org.hibernate.loader.Loader.listIgnoreQueryCache的org.hibernate.loader.Loader.doList(Loader.java:2540) (Loader.java:2370)org.hibernate.loader.Loader.list(Loader.java:2365)位于org.hibernate.hql的org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:497). internal.ast.QueryTranslatorImpl.在Org.hibernate的org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:236)的org.hibernate.internal.SessionImpl.list(SessionImpl.java:1300)中列出(QueryTranslatorImpl.java:387) .internal.QueryImpl.list(QueryImpl.java:103)at com.example.dao.ItemDao.findChildrenByParentId(ItemDao.java:43)at com.example.dao.ItemDao $$ FastClassBySpringCGLIB $$ 51b04ce9.invoke()at org .springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)位于org.springframework.aop.framework.ReflectiveMethodInvocation.proceed的org.springframework.aop.framework.CglibAopProxy $ CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:717) (ReflectiveMethodInvocation.java:157)org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136)...还有47个 引起:java.lang.IllegalArgumentException:对象不是 在sun.reflect.DelegatingMethodAccessorImpl的sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)声明类的实例. .invoke(DelegatingMethodAccessorImpl.java:25)位于org.hibernate.property.BasicPropertyAccessor的java.lang.reflect.Method.invoke(Method.java:597)$ BasicGetter.get(BasicPropertyAccessor.java:169)... 76更多

似乎Hibernate正在尝试使用属性parentId,就好像它是Item类型,而不是String类型.

有任何想法吗?

另外请不要建议我使用延迟加载.在我的情况下这是不可行的(再次,太难解释).

java entity-framework hibernate foreign-keys

7
推荐指数
1
解决办法
1762
查看次数

Spring Boot YAML:设置 null 属性值

null我在设置属性值时遇到问题。

这是在 YAML 文件中定义该值的方式:

my-property: null
Run Code Online (Sandbox Code Playgroud)

这就是我在代码中注入它的方式:

@Value("${my-property}")
private String myProperty;
Run Code Online (Sandbox Code Playgroud)

由于某种原因,Spring 不断注入空字符串 ("") 而不是null. 我是否遗漏了什么或者这是 Spring 中的错误?

java spring yaml spring-boot

7
推荐指数
1
解决办法
7984
查看次数

关闭 Spring Boot AWS 自动配置

我正在使用spring-cloud-aws-autoconfigure:2.1.0.RELEASE连接到AWS。但是,当应用程序在 AWS 以外的环境中运行时,我不希望进行自动配置。

我尝试按照此处此处建议的java 配置类以及spring.autoconfigure.excludesyml 文件中的属性关闭自动配置,如下所示:

spring:
  autoconfigure:
    exclude:
      - org.springframework.cloud.aws.autoconfigure.context.ContextCredentialsAutoConfiguration
      - org.springframework.cloud.aws.autoconfigure.context.ContextInstanceDataAutoConfiguration
      - org.springframework.cloud.aws.autoconfigure.context.ContextStackAutoConfiguration
      - org.springframework.cloud.aws.autoconfigure.messaging.MessagingAutoConfiguration
Run Code Online (Sandbox Code Playgroud)

但这些解决方案似乎都不起作用。自动配置仍然发生,因此应用程序无法启动。

java spring-boot spring-cloud-aws

6
推荐指数
2
解决办法
8236
查看次数

如何在嵌入式Tomcat上定义tomcat-users.xml?

我正在使用Selenium在Maven Web应用程序上运行自动JUnit测试.基本上我在嵌入式Tomcat服务器(org.apache.tomcat.embed)上运行应用程序.应用程序使用BASIC身份验证,因此我需要以某种方式在嵌入式tomcat服务器上定义tomcat-users.xml.我尝试将tomcat-users.xml放到src/main/webapp/META-INF /但是它不起作用.

这是我启动服务器的方式:

tomcat = new Tomcat();
tomcat.setPort(0);
tomcat.addWebapp("/", new File("src/main/webapp/").getAbsolutePath());
tomcat.start();
Run Code Online (Sandbox Code Playgroud)

java junit selenium tomcat

5
推荐指数
1
解决办法
1614
查看次数

String.getBytes("UTF-16")会在所有平台上返回相同的结果吗?

我需要从包含用户密码的String创建一个哈希.要创建哈希,我使用一个字节数组,我通过调用得到String.getBytes().但是当我在一个不是默认编码的平台上使用指定的编码(例如UTF-8)调用此方法时,非ASCII字符将被默认字符替换(如果我正确理解了getBytes()的行为)因此在这样的平台上,我将得到一个不同的字节数组,并最终得到一个不同的哈希值.

由于字符串内部存储在UTF-16中,因此调用String.getBytes("UTF-16")保证我在每个平台上都获得相同的字节数组,无论其默认编码如何?

java string encoding

5
推荐指数
1
解决办法
3997
查看次数

Spring Boot + Hibernate + Flyway:不要在新数据库上运行迁移

我正在使用 Flyway 更新数据库架构。目前,架构的最新版本为 3(最新的迁移文件名为V3__postgres.sql)。

如果我在具有较旧架构版本的数据库上运行应用程序,Flyway 会按预期执行更新脚本。但是,如果我在新的(空)数据库上运行应用程序,flyway 会尝试执行更新脚本,但它找不到任何表(因为 Hibernate 尚未创建它们),并且应用程序会因错误而终止。

我希望 Flyway不在空数据库上执行更新脚本,因为当 Hibernate 创建表时,它们无论如何都将处于最新版本。

如果我理解正确,我应该能够为此使用参数flyway.baseline-version。我的理论是,如果 Flyway 没有找到 table schema_version,它应该创建它并插入一条记录,说明数据库处于版本 3。但即使我设置了flyway.baseline-version=3,Flyway 仍然会执行脚本。我也尝试设置参数flyway.baseline-on-migrate=true及其不同的组合,但我无法让它工作。

baseline-version正确理解参数还是我遗漏了什么?

注意:我知道自 Spring Boot 2 以来,参数命名空间已更改为spring.flyway.*,但我使用的是 Spring Boot 1,因此这不是问题。

java hibernate flyway spring-boot

5
推荐指数
1
解决办法
1万
查看次数

Vue.js - 推迟页面渲染直到数据请求完成

我有一个页面显示使用 axios 从服务器获取的数据。

我想推迟页面渲染,直到 axios 请求完成。

原因是我有该页面的预渲染版本。因此,当 axios 请求仍在运行时,我想显示预渲染的数据而不是空白屏幕(以防止 CLS 问题)。

这就是我目前所拥有的:

export default {

  ....

  created() {
    this.fetchData().then((returnedData) => this.personData = returnedData);
  },

  data() {
    return {
      personData: {
        name: "",
      },
    };
  },

  methods: {
    async fetchData() {
      const response = await axios.get("api/persondata/");
      return await response.data;
    },
  },

  ...

}
Run Code Online (Sandbox Code Playgroud)

所以基本上我想做的是使 axios 请求“同步”,或者以某种方式使函数create()等待,直到请求完成。

理想的情况是完全阻止渲染并仅显示预渲染的页面,以防 axios 请求失败。

关于如何做到这一点有什么想法吗?

javascript vue.js axios vuejs2

5
推荐指数
1
解决办法
1267
查看次数

Flutter:多次调用setState()效率低吗?

假设我有一个方法onButtonPressed(),它先调用 method a(),然后调用 method b()。两种方法a()b()都包含对以下内容的调用setState()

void onButtonPressed() {
    ...
    a();
    ...
    b();
}

void a() {
    ...
    setState() {
        ...
    }
}

void b() {
    ...
    setState() {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

调用setState()两次是否会导致受影响的组件渲染两次,或者 Flutter 是否进行了优化,以便组件仅渲染一次?

flutter

4
推荐指数
1
解决办法
3594
查看次数

PHPUnit与DBUnit:初始夹具无法设置

我为我的一个模块创建了一个数据库测试类.当我尝试运行测试用例时,初始夹具未设置 - 测试数据库中的所有表都是空的.这是我的getDataSet()方法:

    /**
 * @return PHPUnit_Extensions_Database_DataSet_IDataSet
 */
public function getDataSet()
{
    return $this->createFlatXMLDataSet(dirname(__FILE__).'/dataSets/initial.xml');
}
Run Code Online (Sandbox Code Playgroud)

我发现getDataSet()方法被调用,因为当我在其中创建语法错误时,测试执行失败.但是当我在文件initial.xml中创建错误时,没有任何反应.似乎文件initial.xml根本没有被解析!

该文件的路径应该没问题,但我注意到当我输入无效路径时,没有任何事情发生.显然,方法createFlatXMLDataSet()在出错时不会抛出任何异常.所以现在我没有任何线索为什么它不起作用:(

php phpunit dbunit unit-testing

2
推荐指数
1
解决办法
641
查看次数

Mockito 使用泛型集合参数验证方法调用

我有这个方法:

public void myMethod(Set<Item> items);
Run Code Online (Sandbox Code Playgroud)

当我尝试打电话时:

Mockito.verify(instance.myMethod(Mockito.anySet());
Run Code Online (Sandbox Code Playgroud)

我收到此编译错误:

Mockito 类型中的方法 verify(T) 不适用于参数 (void)

即使我定义了一个参数捕获器,我也会得到同样的错误。我怎样才能解决这个问题?

java unit-testing mockito

2
推荐指数
1
解决办法
1045
查看次数