我知道这里有很多关于SO和网络的问题,但是所有答案都建议使用columnDefinition哪个是特定于数据库的,因此不适合我,因为我正在研究的系统需要在不同的数据库上运行.
我发现了这个hibernate问题,有人请求注释这个功能.问题已经结束,说另一个问题将涵盖该功能.第二个问题显然添加了注释@Generated以及其他一些注释,但我找不到任何关于如何使用这些新注释定义默认列值的文档.
所以我的问题是:有谁知道如何用注释定义默认列值(而不是使用columnDefinition)?
编辑:进一步澄清我的问题:当我添加一个新的非空列时,我需要Hibernate来更新现有的模式(将新列添加到相应的表).但由于该列为非null,因此数据库无法在未指定默认值的情况下创建列(如果表中已存在某些行).所以我需要指示Hibernate发出以下DDL语句:ALTER TABLE my_table ADD COLUMN new_column VARCHAR(3) DEFAULT 'def'但它必须独立于使用的数据库.
我有一个分层实体,它将自己引用为父母.我只需要通过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类型.
有任何想法吗?
另外请不要建议我使用延迟加载.在我的情况下这是不可行的(再次,太难解释).
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 中的错误?
我正在使用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)
但这些解决方案似乎都不起作用。自动配置仍然发生,因此应用程序无法启动。
我正在使用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) 我需要从包含用户密码的String创建一个哈希.要创建哈希,我使用一个字节数组,我通过调用得到String.getBytes().但是当我在一个不是默认编码的平台上使用指定的编码(例如UTF-8)调用此方法时,非ASCII字符将被默认字符替换(如果我正确理解了getBytes()的行为)因此在这样的平台上,我将得到一个不同的字节数组,并最终得到一个不同的哈希值.
由于字符串内部存储在UTF-16中,因此调用String.getBytes("UTF-16")保证我在每个平台上都获得相同的字节数组,无论其默认编码如何?
我正在使用 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,因此这不是问题。
我有一个页面显示使用 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 请求失败。
关于如何做到这一点有什么想法吗?
假设我有一个方法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 是否进行了优化,以便组件仅渲染一次?
我为我的一个模块创建了一个数据库测试类.当我尝试运行测试用例时,初始夹具未设置 - 测试数据库中的所有表都是空的.这是我的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()在出错时不会抛出任何异常.所以现在我没有任何线索为什么它不起作用:(
我有这个方法:
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)
即使我定义了一个参数捕获器,我也会得到同样的错误。我怎样才能解决这个问题?